情境
幾周前,我的客戶要求我實(shí)施一個(gè)SSIS包,該包允許他們從FTP服務(wù)器下載文件并進(jìn)行存檔。 代理商數(shù)據(jù),發(fā)票數(shù)據(jù)和銷售數(shù)據(jù)每天都會(huì)上傳到FTP服務(wù)器。他們需要下載它們并導(dǎo)入他們的倉(cāng)庫(kù)數(shù)據(jù)庫(kù)。
方法
為了實(shí)現(xiàn)此要求,我使用了兩個(gè)主要的SSSI任務(wù),即FTP任務(wù)和Foreach循環(huán)容器
FTP任務(wù):用于從FTP服務(wù)器下載文件
Foreach循環(huán)容器: 用于加載每個(gè)下載的文件
開發(fā)環(huán)境
用于Visual Studio 2013 數(shù)據(jù)文件的 SQL Server 2014 Developer SQL Server數(shù)據(jù)工具
我為代理商,發(fā)票和銷售數(shù)據(jù)創(chuàng)建了3個(gè)文件。每個(gè)文件都有3列(Col1,Col2和Col3)
代理機(jī)構(gòu)
Col1 | Col3 | Col3A
| 1 | 3
發(fā)票
Col1 | Col3 | Col3A
| 1 | 3
銷售
Col1 | Col3 | Col3A
| 1 | 3
FTP服務(wù)器
出于演示目的,我使用了支持FTP服務(wù)的DriveHQ服務(wù)。我創(chuàng)建了AAA_ArchivedData文件夾,然后上傳了 代理商數(shù)據(jù),發(fā)票數(shù)據(jù)和銷售數(shù)據(jù)。
我建議您創(chuàng)建一個(gè)免費(fèi)會(huì)員帳戶,因?yàn)槟梢允褂盟鼈儊砼渲肍TP任務(wù)以進(jìn)行下一步
創(chuàng)建登臺(tái)表
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Agency]') AND type in (N'U'))
BEGINCREATE TABLE [dbo].[Agency](
[Col1] [varchar](50) NULL,
[Col2] [varchar](50) NULL,
[Col3] [varchar](50) NULL
) ON [PRIMARY]
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Sales]') AND type in (N'U'))
BEGINCREATE TABLE [dbo].[Sales](
[Col1] [varchar](50) NULL,
[Col2] [varchar](50) NULL,
[Col3] [varchar](50) NULL
) ON [PRIMARY]
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Sales]') AND type in (N'U'))
BEGINCREATE TABLE [dbo].[Sales](
[Col1] [varchar](50) NULL,
[Col2] [varchar](50) NULL,
[Col3] [varchar](50) NULL
) ON [PRIMARY]
實(shí)施SSIS包
- 創(chuàng)建一個(gè)名為L(zhǎng)oad_Multiple_CSV_Fi les.dtsx 的新程序包
- 創(chuàng)建變量
ArchivedFolder:F: SSIS-Pr actice Loa d_Multiple _CSV_Files ArchivedF在較舊的 位置存儲(chǔ)歸檔文件文件連接文件類型OLEDBConnection: 與SQL數(shù)據(jù)庫(kù)服務(wù)器的連接字符串
值:數(shù)據(jù)源= HSSSC1PCL01198 SQLSERVER2014; 初始目錄=演示;提供程序= SQLNCLI11.1;集成安全性= SSPI;數(shù)據(jù)源:數(shù)據(jù)庫(kù)服務(wù)器名稱
初始目錄:數(shù)據(jù)庫(kù)名稱
提供程序:連接到SQL數(shù)據(jù)庫(kù)服務(wù)器的驅(qū)動(dòng)程序。您需要更改值以滿足您的環(huán)境。我使用SQLNCLI11.1的原因是SQL Server Engine是2014。如果您的版本低于SQL 2012的版本,則應(yīng)為10.0 / 10.1
Integrated Security:這 意味著我在連接到SQL Database Server時(shí)使用窗口身份驗(yàn)證模式。SourceFolder:F: SSIS-Prac tice Load_ Multiple_C SV_Files D ataFile 在哪里存儲(chǔ)從FTP服務(wù)器下載的文件在“連接管理器”面板上創(chuàng)建連接
創(chuàng)建OLEDBConnection并將OLEDBConnection變量分配給ConnectionString屬性為CSV文件創(chuàng)建3個(gè)連接(代理商,發(fā)票和銷售),并將FileConnection變量分配給ConnectionString屬性創(chuàng)建ArchivedFolder連接,并將ArchivedFolder變量分配給ConnectionString屬性 - 拖放FTP任務(wù)組件
雙擊打開FTP任務(wù)編輯器創(chuàng)建新的FTP連接以打開FTP連接管理器編輯器服務(wù)器設(shè)定服務(wù)器名稱:ftp.drivehq.com服務(wù)器端口:默認(rèn)為21。FTP站點(diǎn)偵聽此端口。如果您使用其他端口,則需要確保該端口未被防火墻阻止。證書
用戶名:您在DriveHQ注冊(cè)的帳戶密碼:您在DriveHQ注冊(cè)的密碼選件選中“使用被動(dòng)模式”:這意味著客戶端將啟動(dòng)數(shù)據(jù)連接。如果取消選中,則表示您使用活動(dòng)模式。在活動(dòng)模式下,服務(wù)器端啟動(dòng)數(shù)據(jù)連接,在這種情況下為DriveHQ。單擊測(cè)試連接以確保您可以成功連接到DriveHQ單擊“確定”返回“ FTP任務(wù)編輯器”轉(zhuǎn)到文件傳輸選項(xiàng)卡局部參數(shù)IsLocalPathVariable:正確LocalVariable:User :: SourceFolder。我們指定從DriveHQ下載數(shù)據(jù)文件的位置操作方式
操作:接收文件。有很多操作,例如發(fā)送文件,接收文件,創(chuàng)建本地目錄等。在這種情況下,我們要下載文件,因此我們使用接收文件IsTransferAscii:True接受Ascii代碼遠(yuǎn)程參數(shù)
IsRemotePathVariable:假遠(yuǎn)程路徑:/ AAA_ArchivedData/* . txt。該選項(xiàng)指定了我們?cè)贒riveHQ上下載數(shù)據(jù)文件的位置。AAA_ArchivedData是在上述步驟中創(chuàng)建的,我還上傳了測(cè)試文件。* .txt指定我們下載所有擴(kuò)展名為txt的文件點(diǎn)擊確定 - 拖放執(zhí)行SQL任務(wù)組件
該任務(wù)是截?cái)嘀皠?chuàng)建的表 - 拖放Foreach循環(huán)容器組件
雙擊以打開Foreach循環(huán)編輯器轉(zhuǎn)到收藏夾標(biāo)簽枚舉器:Foreach文件枚舉器添加表達(dá)式目錄:@ [User :: SourceFolder]枚舉器配置
文件:*。txt表示僅加載文本文件檢查完全合格轉(zhuǎn)到變量映射
用戶:: FileConnection索引= 0點(diǎn)擊確定將腳本任務(wù)組件拖放到Foreach循環(huán)中,并將其命名為Parse File Name
此任務(wù)用于檢測(cè)哪種文件類型(代理商,發(fā)票或銷售)雙擊打開腳本任務(wù)編輯器ReadOnlyVariables:User :: FileConnectionReadWriteVariables:User :: FileType單擊編輯腳本...,然后輸入以下代碼
public void Main(){//待辦事項(xiàng):在此處添加代碼string filepath = Dts.Variables [“ FileConnection”]。Value.ToString(); 字符串文件名= Path.GetFileName(filepath); if(filename.ToUpper()。Contains(“ INVOICE”)){Dts.Variables [“ FileType”]。Value =“ Invoice”; } else if(((filename.ToUpper()。Contains(“ AGENCY” ))){Dts.Variables [“ FileType”]。Value =“ Agency”; } else if(((filename.ToUpper()。Contains(“ SALES”)))){Dts.Variables [“ FileType”]。Value =“ Sales”; } else Dts.Variables [“ FileType”]。Value =“未知”; Dts.TaskResult =(int)ScriptResults.Success; } Variables [“ FileType”]。Value =“ Agency”; } else if(((filename.ToUpper()。Contains(“ SALES”)))){Dts.Variables [“ FileType”]。Value =“ Sales”; } else Dts.Variables [“ FileType”]。Value =“未知”; Dts.TaskResult =(int)ScriptResults.Success; } Variables [“ FileType”]。Value =“ Agency”; } else if(((filename.ToUpper()。Contains(“ SALES”)))){Dts.Variables [“ FileType”]。Value =“ Sales”; } else Dts.Variables [“ FileType”]。Value =“未知”; Dts.TaskResult =(int)ScriptResults.Success; } } else if(((filename.ToUpper()。Contains(“ SALES”)))){Dts.Variables [“ FileType”]。Value =“ Sales”; } else Dts.Variables [“ FileType”]。Value =“未知”; Dts.TaskResult =(int)ScriptResults.Success; } } else if(((filename.ToUpper()。Contains(“ SALES”)))){Dts.Variables [“ FileType”]。Value =“ Sales”; } else Dts.Variables [“ FileType”]。Value =“未知”; Dts.TaskResult =(int)ScriptResults.Success; } 值=“銷售”;} else Dts.Variables [“ FileType”]。Value =“未知”; Dts.TaskResult =(int)ScriptResults.Success; } 值=“銷售”;} else Dts.Variables [“ FileType”]。Value =“未知”; Dts.TaskResult =(int)ScriptResults.Success; }點(diǎn)擊確定拖放“數(shù)據(jù)流任務(wù)”組件并將其命名為“ 加載發(fā)票”
在“ 解析文件名”腳本任務(wù)和“ 加載發(fā)票”之間建立連接打開優(yōu)先約束編輯器在連接上雙擊
評(píng)估操作:表達(dá)式表達(dá)式: @ [User :: FileType] ==“發(fā)票e”單擊邏輯或。點(diǎn)擊確定雙擊加載發(fā)票數(shù)據(jù)流
拖放平面文件源組件并將其命名為發(fā)票文件
平面文件連接管理器:發(fā)票列:所有列拖放OLEDB目標(biāo),名稱為“ 發(fā)票目標(biāo)”
OLEDB連接管理器:OLEDBConnection數(shù)據(jù)訪問視圖:表和視圖-快速加載表或視圖的名稱:發(fā)票使用平面文件源進(jìn)行映射拖放數(shù)據(jù)流任務(wù)組件并將其命名為Load Agency
重復(fù)我們?yōu)榘l(fā)票實(shí)施的所有步驟,但將優(yōu)先約束編輯器的表達(dá)式更改為 @ [User :: FileType] ==“ Agency ” SSIS_Multiple_CSV_LoadAgency.PNG拖放數(shù)據(jù)流任務(wù)組件并將其命名為Load Sales
重復(fù)所有步驟,我們實(shí)現(xiàn)了發(fā)票,但優(yōu)先約束編輯器的變化表達(dá)對(duì) @ [用戶::文件類型] ==“銷售”拖放文件系統(tǒng)任務(wù)組件
雙擊打開文件系統(tǒng)任務(wù)編輯器IsDestinationPathVariable: 假DestinationConnection:ArchivedFolder。這是我們之前創(chuàng)建的文件夾連接OverwriteDestination:False操作:移動(dòng)文件。有很多操作,但是在成功處理數(shù)據(jù)文件之后,我們使用“移動(dòng)文件”來存檔數(shù)據(jù)文件IsSourcePathVariable:正確SourceConnection:用戶:: FileConnection
執(zhí)行SSIS包
最后,我們的程序包已經(jīng)完成,我們需要執(zhí)行它以查看其工作原理?
- 檢查文件夾 F: SSIS-Practice Load_Mult iple_CSV_F iles DataF ile,以確保沒有數(shù)據(jù)文件
- 檢查文件夾 F: SSIS-Practice Load_Mult iple_CSV_F iles Archi vedFolder 以確保沒有數(shù)據(jù)文件
- 從代理商,發(fā)票和銷售表中查詢數(shù)據(jù)以確保它們?yōu)榭?/li>
執(zhí)行程序包執(zhí)行程序包后
驗(yàn)證結(jié)果
優(yōu)秀,導(dǎo)入的數(shù)據(jù)和數(shù)據(jù)文件也按我們的預(yù)期保存到了文件夾中。在我的示例中,存檔文件夾是本地的,您仍然可以使用FTP Task組件將文件上傳到任何地方。
結(jié)論
在現(xiàn)實(shí)生活中,有許多方案需要您將SSIS組件組合在一起。希望您通過本示例對(duì)如何使用FTP任務(wù)和Foreach循環(huán)容器同時(shí)處理多個(gè)文件有一個(gè)概述。






