容器
容器是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變量的值
1
2
3
4
5
6
7
8
|
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()方法體內的代碼
1
2
3
4
5
6
7
8
9
10
|
<div class= "cnblogs_Highlighter sh-gutter" ><pre class= "brush:vbnet;gutter:true;" > 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 </pre> </div> |
注:VS2008環境內部分s代碼是Dts.TaskResult = ScriptResults.Success
7. 點擊OK退出編輯界面,執行這個package得到的結果如圖4-6(彈出內容根據具體設置不同而不同)
圖4-6
圖4-7
轉:http://www.cnblogs.com/tylerdonet/archive/2011/04/08/2009890.html