1. 程式人生 > >SSIS中的容器和資料流—簡單介紹

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

現在來試驗一個迴圈容器的用法,在這個例子中將試驗在迴圈中五次執行一段指令碼,這是一個很簡單的例子,可以新增一些其他功能。

  1. 建立一個SSIS專案,將預設的package更名為ForLoop.dtsx
  2. 開啟這個package,川建一個新的變數Counter,在面板中右擊選擇Variables,點選新增變數按鈕,預設變數型別為int32
  3. 從工具箱中拖放一個Loop迴圈容器,雙擊開啟編輯頁面,設定InitExpression為@Counter = 0,迴圈開始時變數Counter的值設定為0,EvalExpression選項設定為@Counter < 5 and @Counter = @Counter + 1
    ,在滿足條件@Counter<5是迴圈一直執行,並自加1,在Name選項中輸入Iterate through a Script,最後如圖4-3
  4. 在這個Loop迴圈容器中拖放一個指令碼任務,雙擊這個指令碼任務,取名為Pop Up the Iteration
  5. 在指令碼任務的編輯頁面如圖4-4,在ReadOnlyVariables選項中輸入Counter,向任務傳入一個引數變數
  6. 點選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

  1. 退出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迴圈容器類似的例子,在這個例子中我們將列舉一個資料夾下的所有檔案,使用對話方塊輸出檔案的名字資訊。

  1. 新建一個專案,將預設包重新命名為ForeachLoop.dtsx
  2. 拖拽一個Foreach迴圈容器,雙擊開啟編輯介面,在General標籤內將它重新命名為Iterate through Files
  3. 在Collection標籤內,報紙Enumerator屬性預設值Foreach File Enumerator,設定Folder屬性內選擇一個檔案較少的資料夾,這個例子不會修改檔案,只是讀出檔案的相關資訊,在Files選項內保持預設值“.”,最後的介面如圖4-5
  4. 轉到變數對映標籤頁面內,在變數列內選擇<New variable…>,開啟新增變數對話方塊。為變數命名FileName,在Index列內變數的值預設0,因為只對一個資料夾下的檔案迴圈操作,所以保持預設值0不變,點選OK退出編輯介面
  5. 拖放一個指令碼任務放置到Foreach迴圈容器中,雙擊開啟編輯介面重新命名為Read Files
  6. 轉到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