SSIS中的容器和數據流—簡單介紹
容器
容器是SSIS為一個或多個任務提供一種結構的對象。例如可以執行一個循環直到到達邊界條件,或者將一系列的task按邏輯組織在一起。一個容器也可以包含其他的容器。容器和任務(task)一樣也放在Control Flow標簽內,總共有四種類型的容器:任務宿主Task Host,Sequence序列,For循環和Foreach循環。
任務宿主Task Host Containers
任務宿主是單個task的默認容器,你在工具欄中找不到這種工具的圖標,實際上即使不選擇一個容器,單個task仍然包含在一個任務宿主中。SSIS的結構通過任務宿主來擴展變量和事物控制。
Sequence容器
Sequence容器可以處理package中的子任務,將package劃分成更容易控制的小片段。下面是Sequence容器的一些應用:
- 將task歸類使其中一部分不再需要的task不能執行
- 縮小一個容器中的變量范圍
- 設置容器中所有task的屬性
- 使用方法來保證一個task執行成功之后再執行下一個task
在工具欄的Control Flow中拖放一個Sequence容器,如圖4-1,左邊是一個Sequence容器,包含兩個task,右邊是一個Foreach循環容器,左邊容器中的task執行成功之后才能執行右邊容器中的task。

圖4-1
For循環容器
For循環容器像其他程序語言一樣,是一種創建循環方法的任務。在這種循環中SSIS設置一個初始值,在循環中不斷地重新賦值,只到不滿足邊界條件。
雙擊打開For循環容器的編輯頁面如圖4-2。InitExpression選擇項設置循環的初始條件。EvalExpression選擇項是每次循環都會重新賦值的,一旦它變成false,循環將停止。AssignExpression可以在每次循環時都改變表達式的值。

圖4-2
現在來試驗一個循環容器的用法,在這個例子中將試驗在循環中五次執行一段腳本,這是一個很簡單的例子,可以添加一些其他功能。
- 創建一個SSIS項目,將默認的package更名為ForLoop.dtsx
- 打開這個package,川建一個新的變量Counter,在面板中右擊選擇Variables,點擊添加變量按鈕,默認變量類型為int32
- 從工具箱中拖放一個Loop循環容器,雙擊打開編輯頁面,設置InitExpression為@Counter = 0,循環開始時變量Counter的值設置為0,EvalExpression選項設置為@Counter < 5 and @Counter = @Counter + 1,在滿足條件@Counter<5是循環一直執行,并自加1,在Name選項中輸入Iterate through a Script,最后如圖4-3
- 在這個Loop循環容器中拖放一個腳本任務,雙擊這個腳本任務,取名為Pop Up the Iteration
- 在腳本任務的編輯頁面如圖4-4,在ReadOnlyVariables選項中輸入Counter,向任務傳入一個參數變量
- 點擊Design Script,打開Visual Studio編輯環境,在Mian()方法體內輸入下面的代碼,代碼根據變量彈出對話框顯示Counter變量的值
Public Sub Main()
Dim variables As Variables
If Dts.Variables.Contains("Counter") = True Then
Dts.VariableDispenser.LockOneForRead("Counter", variables)
End If
MsgBox("You are in iteration: " & CStr(variables("Counter").Value))
Dts.TaskResult = Dts.Results.Success
End Sub
注:VS2008環境內部分代碼是Dts.TaskResult = ScriptResults.Success
- 退出Visual Studio編輯環境,回到原來的編輯界面,執行這個package結果如圖4-5,會出現5個彈出框,從0到4,Task的顏色變成綠色,然后右變成黃色。最終執行完之循環后又變成綠色。

圖4-3

圖4-4
Foreach循環容器
Foreach循環容器是一個很強大的容器,它可以對對象集合進行循環操作。在循環操作的過程中取得對象集合中相關值,對象集合的類型可以是文件等,在下面列舉。還可以將對象集合中的值映射到變量中。對象的類型根據標簽Collection中Enumerator屬性的設置不同,這些屬性如下:
- For Each File Enumerator:對指定文件夾下的文件進行循環操作
- For Each Item Enumerator:對手動設置的對象集合進行循環操作
- For Each ADO Enumerator:對一個ADO集合中的表中的行進行循環操作
- For Each ADO.NET Schema Rowset Enumerator:對一個ADO.NET模型進行循環操作
- For Each From Variable Enumerator:對一組SSIS變量進行循環操作
- For Each Nodelist Enumerator:對一組XML節點對象進行循環操作
- For Each SMO Enumerator:對一組SQL管理對下你給進行循環操作
我們來做一個和For循環容器類似的例子,在這個例子中我們將列舉一個文件夾下的所有文件,使用對話框輸出文件的名字信息。
- 新建一個項目,將默認包重命名為ForeachLoop.dtsx
- 拖拽一個Foreach循環容器,雙擊打開編輯界面,在General標簽內將它重命名為Iterate through Files
- 在Collection標簽內,報紙Enumerator屬性默認值Foreach File Enumerator,設置Folder屬性內選擇一個文件較少的文件夾,這個例子不會修改文件,只是讀出文件的相關信息,在Files選項內保持默認值“.”,最后的界面如圖4-5
- 轉到變量映射標簽頁面內,在變量列內選擇<New variable…>,打開添加變量對話框。為變量命名FileName,在Index列內變量的值默認0,因為只對一個文件夾下的文件循環操作,所以保持默認值0不變,點擊OK退出編輯界面
- 拖放一個腳本任務放置到Foreach循環容器中,雙擊打開編輯界面重命名為Read Files
- 轉到Script標簽,在ReadOnlyVariale屬性內設置變量FileName,點擊Design打開Visual Studio編輯環境,使用下面代碼代替Main()方法體內的代碼
Public Sub Main() Dim variables As Variables If Dts.Variables.Contains("Counter") = True Then Dts.VariableDispenser.LockOneForRead("Counter", variables) End If MsgBox("You are in iteration: " & CStr(variables("Counter").Value)) Dts.TaskResult = Dts.Results.Success End Sub
注:VS2008環境內部分s代碼是Dts.TaskResult = ScriptResults.Success
7. 點擊OK退出編輯界面,執行這個package得到的結果如圖4-6(彈出內容根據具體設置不同而不同)

圖4-6

圖4-7
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號