容器是Integration Services 包中非常重要的一部分功能,它可以對控制流程中的任務進行直觀的劃分與組織,使包的結構簡明扼要、易於管理、易於維護。
在Integration Services 中,主要有以下三種類型的容器: 序列容器(SequenceContainers)、For 迴圈、Foreach 迴圈。下面我們將一一介紹這三種容器的使用方法。
(一)、序列容器(SequenceContainers)。
序列容器是一種十分簡單,但使用非常廣泛的容器,它可以對控制流程的任務流組件進行結構化處理,把一些業務相關的工作群組件,放到一個序列容器中,使整個包看起來更加整潔、美觀,就如同我們家裡的書櫃、衣櫃似的,把不同種類的東西整理在裡面,收藏起來,既美觀,又易於取用。
比如,在一個Integration Sevices包中,包含有財務資料、業務資料。整個包中的工作群組件會非常多,如果不對它們進行分組管理,整個包看起來就會比較亂,非常難於管理與維護。相反如果我們將處理財務資料的任務,放入一個序列容器中,將處理業務資料的任務放入另一個序列容器,整個包看起來,就會一目瞭然,哪些任務是處理財務資料,哪些任務是處理業務資料了,非常清楚。
不僅如此,如果點擊右上方象箭頭一樣的符號,還可才把這些容器摺疊起來,整個包就更加清楚明了,一目瞭然了。
(二)For 迴圈。
For 迴圈組件,類似於程式設計語言中的For 迴圈,當人們需要反覆執行同一個工作任務或者一系列工作任務的時候,就需要用到For 迴圈,它既可以用於有限次迴圈,也可以用於“無限次迴圈”,比如我們監控包的健全狀態,當錯誤資料>=5時,包停止運行,並通知管理員;又如監控某個檔案夾是否有新檔案產生、監控網路連結是否正常、監控伺服器的各項指標(Cpu、記憶體)是否正常等,論詢特定事件是否發生,這就可以設定為無限次迴圈。
For 迴圈的使用非常簡單,它主要有三個運算式,分別控制迴圈的執行和終止,
按照,完成運算式的值,For 迴圈就算完成了(@ErrorCount 是使用者自訂變數,需要按照上一課的內容,先定義變數,此處才可以使用)。然後再將需要重複執行的任務,拖入For 迴圈容器中就可以了。
(三)Foreach 迴圈。
在.net 程式設計語言中,有一個迴圈也叫做Foreach ,從語義來講,這兩種迴圈如出一徹,沒有什麼差異。在Integration Services 中,Foreach 迴圈是最重要的一種迴圈,也是使用最頻繁的一種迴圈,常用於對一個集合對象中的每一個元素,都要進行處理的情境。比如枚舉某一個檔案夾下的所有檔案,枚舉一個DataTable 中的某一條記錄、枚舉一顆樹(tree )下的每個結點(Node)等。下面我們將Foreach 最常用的兩種類型:Foreach 檔案列舉程式、Foreach ADO 枚舉進行簡單的說明。
Foreach 檔案列舉程式。
通常情況下,我們需要迴圈處理某一檔案夾下的每一個檔案,這時就需要用到Foreach 檔案列舉程式了,比如前面我們說到IISLOG的匯入,IisLog 檔案很多,每天都會產生很多個這樣的檔案,如果靠手工一個一個地處理,將很不現實,工作量非常大,如果我們用Foreach 檔案列舉程式,就會非常簡單。,開啟Foreach 迴圈編輯器:
Enumerator:Foreach 枚舉類型。在Foreach迴圈中,有很多種枚舉類型,每一種枚舉類型,就代表著一種使用情境,它們的使用方法也各不相同。每一種枚舉類型的意義及使用方法,請參考官方文檔:http://technet.microsoft.com/zh-cn/library/ms187670(SQL.90).aspx 這裡有非常詳細的說明。
我們選擇“Foreach 檔案列舉程式”,然後在列舉程式配置項中,輸入檔案夾的位置(注意這裡是檔案夾的位置,而不是檔案的位置),輸入檔案名稱萬用字元(如*.log
*.txt 等),其它按照預設設定就可以了,如果需要遍曆檔案夾下的子目錄,請勾選“遍曆子檔案夾”選項。
下一步,選擇“變數映射”,
點擊“確定”,回到控制流程開發面板。
最後,在“連線管理員”中,找到映射log 檔案的一般檔案串連(IisLog),設定屬性Expressions 的ConnectionString =User::LogFile。
Foreach 檔案列舉程式就算完成了,F5就可以達到你你想要的效果了。結果如下:
其中的“檔案系統任務”是將處理完成的檔案複份到另外一個檔案夾,或者刪除,以免重複執行。
Foreach ADO 列舉程式:枚舉表或者表中每一行記錄。
這種列舉程式在日常開發過程中,也用得非常普遍,類似於TSQL中的遊標,先Select 出一批資料,儲存在ADO記錄集中,然後再一行一行地處理。
假設有一個商業公司,它在全國或者全市的各個地方,都有連鎖專賣店,每個專賣店都是通過POS進行銷售和收銀,為了保證前端銷售快速穩定地運行,POS系統一般都採用C/S模式,資料與系統程式都儲存在本地。集團公司的中高層主管為了隨時瞭解各專賣店銷售經營情況,就需要定時或者不定時地將專賣店的資料同步到總部資料中心。
如果我們對每個專賣店DB,都建立一個連結,再建立一個對應的同步任務,隨著專賣店的增加,同步任務也隨之增加,到最後,功能類似的同步任務就會越來越多,而且每增加一個專賣店,ETL包都要增加一個任務,管理起來,將非常困難。
根據我的經驗是,在總部資料中心建立一張表,專門配置各專賣店DB的連結憑證(ConnectionString), 在同步時,先Select 出各DB的ConnectionString ,然後再動態建立DB串連。這樣一來,程式就小巧、穩定多了。下面我們來看看如何?這一需求:
首先,定義兩個變數,一個於用儲存ConnectionString(字元型);一個用於儲存ADO 記錄 集(Object 型)。
然後在控制流程中增加一個SQL任務,配置如下:
Connection:選擇“資料中心”的連結器。
SQLStatement: 輸入如下SQL,以取出所有配置記錄。
代碼
SELECT 'Data Source=' + strDBServerIP + ';User ID=' + strDBUserID +
';Initial Catalog=HumanResource;Provider=SQLNCLI10;Auto Translate=True;' AS
ConnectionString
FROM DbConfig
ResultSet :選擇“完整結果集”。
然後切換到“結果集”,配置結果集選項,(注意:User::DataSet 一定要是Object 類型的變數,其它變數都不可用)
點擊“確定”,就完成了各DB的串連配置,下面就看Foreach ADO 迴圈如何來應用這個結果集了。
找開Foreach 迴圈編輯器,在Enumerator 中選擇“Foreach Ado 枚舉”,
請注意的每一個選項,如果選錯,都可能達不到你想要的效果。
變數映射,
最後一步,就是將變數映射到OLE DB 的串連上了,從連線管理員中,選擇 DB串連,右擊配置Expressions屬性的ConnectionString =User::ConnectionString ,
整個Foreach ADO 迴圈完成了,F5一切如你所願,綠油油的一遍就會呈現在你的眼前。
常用的三種容器就介紹完了,當然還有一些其它容器,比如一個包,是一個容器,一個分組(在控制流程中選擇一批任務,右鍵菜單“分組”,就可以將這批任務放在一個Group 內)也是一個容器,但是這些容器都非常簡單,就此略過,不做詳細說明。
在Inegration Services 中,容器還可以嵌套,每個容器都可以相互嵌套,它們可以有各自的範圍,有各自的命名空間,如果我們善加利用,將會為Integration Services 的結構化開發,提供很多的方便。