第八篇 Integration Services:進階工作流程管理

來源:互聯網
上載者:User

標籤:

本篇文章是Integration Services系列的第八篇,詳細內容請參考原文。

簡介
在前面兩篇文章,我們建立了一個新的SSIS包,學習了SSIS中的指令碼任務和優先順序條件約束,並檢查包的MaxConcurrentExecutables屬性。我們檢查、示範並測試優先順序條件約束賦值為"成功"、"完成"、"失敗"時對工作流程的影響。
在這一篇,我們繼續深入SSIS工作流程管理——學習SSIS變數和優先順序條件約束運算式。
關於變數
開啟Precedence.dtsx包。點擊BIDS頂部的SSIS,在彈出的下拉式功能表選擇變數:

圖8.1 選擇變數工具列
變數表單將會8.2展示:

圖8.2 變數表單
在變數表單的頂部,有一排SSIS變數使用的工具列。這些按鈕分別是(從左至右):
添加變數:
刪除變數:剛開啟時,這個按鈕是禁用的,因為Precedence.dtsx包還沒有配置SSIS變數
顯示系統變數:許多系統變數是SSIS包的屬性。部分系統變數是組成SSIS的組件和對象的屬性
顯示所有變數:顯示SSIS包中的所有變數,忽略範圍
選擇變數列:8.3所示,點擊此按鈕來設定在變數表單顯示哪些列

圖8.3 選擇變數列
變數名稱、範圍、資料類型、值預設是顯示的。你不能取消變數名稱列,但你可以決定選擇作業域、資料類型和值,你也可以選擇命名空間和變數值更改時引發事件。
變數和命名空間
SSIS包中有兩個預設的命名空間:System和User.你不能夠添加系統變數,但是你可以添加使用者變數並且你可以建立新的名稱空間。變數名稱在範圍和命名空間下必須唯一。這就意味著你可以在User命名空間有一個MyVariable變數,它的完整名稱是User::MyVariable(命名空間::變數名稱)。在本例中User::MyVariable範圍是Precedence.dtsx包。為了建立User2命名空間,你需要顯示命名空間列,然後編輯文本從User改成User2.當你在同一範圍訪問具有相同名稱但不同命名空間的變數時,你應該使用完整的變數名稱,否則你會收到一個類似下面的錯誤:
因為在不同的命名空間中存在具有該名稱的變數,指定命名空間限定名稱以防止歧義。
添加變數
為了示範運算式和SSIS優先順序條件約束,讓我們給Precedence.dtsx包添加一個SSIS變數。點擊變數表單中的添加變數按鈕。一個Int32類型的變數就會建立:

圖8.4 添加變數
重新命名變數為MyBool並修改其資料類型為Boolean:

圖8.5 重新命名變數並修改資料類型
現在我們就可以在優先順序條件約束的運算式中使用這個變數。
運算式和優先順序條件約束
右擊Script Task 1和Script Task 2之間的優先順序條件約束,然後點擊"編輯",開啟優先順序條件約束編輯器:

圖8.6 優先順序條件約束編輯器
優先順序條件約束編輯器有兩個控制項。它們被標記為“約束選項”和“多重約束”。當我建立SSIS包,
我自然的標記控制流程任務按照自上而下的順序執行。配置任務自上而下執行的一個積極作用:優先順序條件約束編輯器上的控制項布局與優先順序條件約束在控制流程的物理布局保持一致。“約束選項”設定前面任務或者優先順序條件約束"起點"的約束屬性;“多重約束”設定後面任務或者優先順序條件約束"終點"的屬性:

圖8.7 優先順序條件約束起點和終點
在優先順序條件約束編輯器,點擊"求值運算"下拉式功能表檢查選項列表:

圖8.8 "求值運算"列表
預設選項是約束,前幾篇中我們所使用的選項。選擇"約束"允許我們配置何時(或是否)執行下一個任務——純粹依賴於前一個任務的執行結果。"值"下拉式清單包含約束求值的選項:成功、失敗和完成。

圖8.9 "值"列表
更改"求值運算"為運算式,並在運算式文字框中鍵入@MyBool

圖8.10 修改約束選項
點擊測試按鈕驗證文字框中的運算式。返回結果應該如下所示:

圖8.11 運算式測試返回結果
注意SSIS變數MyBool的值是一個Boolean的資料類型,它的預設值設為False.鍵入到運算式文字框的運算式必須是True或False(布爾值)。
我可以編輯運算式為"@MyBool == True".運算式"@MyBool"和"@MyBool == True"邏輯上是等價的,因為它們產生相同的結果。
一旦配置好,關閉優先順序條件約束編輯器。你的控制流程應該如下所示:

圖8.12 配置為運算式約束的控制流程
在BIDS下執行Precedence包,會提醒你選擇Script Task 1成功或失敗:

圖8.13 選擇Script Task 1執行結果
無論你選擇哪個選項,都不會影響後面的執行。因為優先順序條件約束求值純粹依賴SSIS變數MyBool的值。@MyBool預設是False,因此Script Task 2永遠不會執行,因為優先順序條件約束永遠不會等於True.
為了建立一個更有用的測試,開啟Script Task 1編輯器,點擊ReadWriteVariables屬性的省略符號。開啟選擇變數視窗。選擇User::MyBool變數:

圖8.14 選擇變數
點擊確定關閉選擇變數視窗。你的指令碼任務編輯器的ReadWriteVariables屬性現在應該包含SSIS變數User::MyBool

圖8.15 添加使用者變數後
點擊編輯指令碼按鈕開啟指令碼編輯器視窗。用代碼8.1編輯Public Sub Main()中的指令碼:

    Public Sub Main()        Dim sTaskName As String = Dts.Variables("TaskName").Value.ToString        Dim iResponse As Integer = MsgBox("Set MyBool to True?", MsgBoxStyle.YesNo, sTaskName)        If iResponse = MsgBoxResult.Yes Then            Dts.Variables("User::MyBool").Value = True        Else            Dts.Variables("User::MyBool").Value = False        End If        Dts.TaskResult = ScriptResults.Success    End Sub

代碼8.1
關閉指令碼編輯器然後點擊確定關閉指令碼任務編輯器。在BIDS調試器下執行Precedence包:

圖8.16
如果你點擊"是"按鈕,你會看到訊息框顯示Script Task 2執行完成:

圖8.17
如果你點擊"否"按鈕,Script Task 2將不會執行:

圖8.18
右擊Script Task 2點擊複製,然後在控制流程的空白處右擊選擇粘貼。一個新的指令碼任務添加到控制流程,名稱是"Script Task 2 1",重新命名新指令碼任務為"Script Task 3",並從Script Task 1串連一個新優先順序條件約束:

圖8.19
如果你你現在在BIDS調試器下執行包,不管你將變數MyBool的值設定為True還是False,Script Task 1都會成功執行。當它成功時,Script Task 1與Script Task 3之間的優先順序條件約束求值為True,然後會顯示Script Task 3完成的訊息框:

圖8.20
讓我們編輯Script Task 1與Script Task 3之間的優先順序條件約束。右擊優先順序條件約束開啟優先順序條件約束編輯器,修改求值運算為"運算式",在運算式文字框鍵入"[email protected]"(不需要雙引號):

圖8.21
"[email protected]"運算式可以理解為"Not MyBool"——如果SSIS變數User::MyBool的值是False那麼[email protected]就是True.點擊確定按鈕關閉優先順序條件約束編輯器。你的控制流程應該如所示:

圖8.22
不知道你那邊如何,但是我這邊看起來有點淩亂。函數表徵圖在一起了。我們可以適當調整優先順序條件約束的位置,讓整體看起來明朗些:

圖8.23
在BIDS調試器下執行包。如果Script Task 1的提示選擇"是",Script Task 2將會執行:

圖8.24
如果Script Task 1的提示選擇"否",Script Task 3將會執行:

圖8.25
優先順序條件約束提供巨大的視覺反饋。比如,藍色表示一個求值運算設定為完成。但是我們的求值運算完全忽略了約束。讓我們思考一下,約束的求值有:成功、失敗和完成。成功意味著之前的任務成功;失敗意味著之前的任務失敗。成功和失敗都表明完成。完成表明之前的任務已經操作但不管它是成功還是失敗的。完成忽略之前任務執行的結果,不管它是成功還是失敗。
當我將求值運算設定為運算式時同樣會忽略之前任務執行折結果。我只關心任務是否完成。
複製禁用儲存已有的任務
在我們繼續前行之前,讓我們先儲存已經操作過的工作。從工具箱拖一個序列視窗到控制流程:

圖8.26
如果你在控制流程的空白處點擊一下,然後畫/拖出一個方框覆蓋三個指令碼任務,你就可以把它們當做一個組來拖動它們到序列容器:

圖8.27 將指令碼任務拖放到序列容器
當你這樣操作的時候,大多數情況下序列容器會自動調整大小以包括拖入裡面的組件。如果它沒有自動調整,手動調整以免引起誤解。
右擊序列容器點擊複製。右擊控制流程的空白處點擊粘貼。你的控制流程應該如下所示:

圖8.28 複製並粘貼序列容器
現在右擊序列容器(原始那個)點擊禁用。序列容器和它裡面的組件都會被禁用(顯示為灰色):

圖8.29 禁用序列容器
現在我們就可以繼續做新工作的時候儲存已經完成的工作了。
多重約束
在序列容器1中刪除Script Task 1.這也會刪除Script Task 1與Script Task 2之間的約束。複製Script Task 2然後粘貼到序列容器1,並重新命名為Script Task 4.移動Script Task 2讓它和Script Task 4並排,然後串連Script Task 2和Script Task 3之間的優先順序條件約束;在Script Task 4與Script Task 3之間建立一個新的約束。

圖8.30 建立Script Task 4並串連約束
現在,讓我問你,為了讓Script Task 3執行需要有什麼操作?
1、Nothing.當其他任務執行後Script Task 3就會執行
2、當Script Task 4或Script Task 2執行並成功後Script Task 3就會執行
3、當Script Task 4與Script Task 2執行並成功後Script Task 3就會執行
4、Script Task 3永遠不會執行
答案可以從優先順序條件約束編輯器的多重約束找到:

圖8.31 多重約束"邏輯與"
記住,多重約束定義優先順序條件約束在終點如何操作。當終點任務只有一個優先順序條件約束限制時,這些選項是沒有實際意義的。但是當有兩個及以上約束在終點任務,這個選項就很重要。
預設是選擇"邏輯與",這意味著在終點任務的所有約束必須都通過求值運算,才能執行後面的任務。本例中,Script Task 4與Script Task 2必須執行並成功後Script Task 3才會執行。讓我們在BIDS調試器下執行包以驗證前面的推測:

圖8.32
直到Script Task 4與Script Task 2執行並成功後,Script Task 3才會開始執行(與上面的第3種情況相符)。這就是多重約束的"邏輯與"操作。接下來讓我們測試"邏輯或"。停止調試,雙擊開啟開啟優先順序條件約束編輯器。更改多重約束為"邏輯或",如所示:

圖8.33 多重約束"邏輯或"
點擊確定按鈕關閉優先順序條件約束編輯器。你可能注意到串連到Script Task 3的優先順序約束的外觀上的變化。優先順序條件約束現在都用虛線表示,8.34所示:

圖8.34
因為多重約束配置處理終點任務,修改其中一個會影響到所有串連到終點任務的約束。
之前,在我們配置多重約束為"邏輯與"時,所有的優先順序條件約束需要先求值,之後的任務才會執行。我們現在配置為"邏輯或",讓我們測試下,為了讓Script Task 3執行需要有什麼操作?在BIDS調試器下執行包,此時你的控制流程應該類似於圖8.35:

圖8.35
只要Script Task 4或Script Task 2執行成功,Script Task 3就會開始執行。
混合約束和運算式運算
停止調試,雙擊開啟Script Task 4和Script Task 3之間的優先順序條件約束編輯器。更改多重約束選項為"邏輯與"。設定求值運算為"運算式和約束",確保值設定為成功,運算式設定為@MyBool:

圖8.36
為了這個約束求值,之前的任務必須執行且成功,並且SSIS變數User::MyBool必須為True.讓我們查看變數,8.37,MyBool的值設定為Flase

圖8.37
這個約束的值會為True嗎?不會。因為約束(成功)的值必須為True而且運算式(MyBool)的值也必須為True.但是MyBool是Flase.因此不管Script Task 4成功或失敗,MyBool是Flase會阻止約束進行求值。
測試一下。在BIDS調試器下執行包並觀察結果。你永遠不會看到包執行到Script Task 3:

圖8.38
停止調試。讓我們再次開啟Script Task 4和Script Task 3之間的優先順序條件約束編輯器。修改求值運算為"運算式或約束":

圖8.39
關閉優先順序條件約束編輯器,然後執行包。這一次,Script Task 3將會執行:

圖8.40
因為串連到Script Task 3的優先順序條件約束的值都為True.很容易理解Script Task 2和Script Task 3之間的約束的值。但是Script Task 4和Script Task 3之間的約束是如何求值的呢?求值運算設定為"運算式或約束"意味著只要運算式或約束的值為True即可。如果兩者都為True,約束還是為True.但是或條件要求至少有一個(運算式或約束)值為True.這裡運算式MyBool是Flase;約束的值是True(之前的任務成功執行)。這就是為什麼Script Task 3會執行。
優先順序條件約束注釋
你可能已經注意一件事:當我們在求值運算中做最後一次更改時(從"運算式和約束"改為"運算式或約束"),控制流程中的表徵圖沒有任何可視化的改變。有一種方法:點擊選擇優先順序條件約束,然後按F4開啟屬性視窗。把第一個屬性ShowAnnotation的值設定為"ConstraintOptions":

圖8.41
ShowAnnotation屬性的ConstraintOptions會顯示求值運算的說明:

圖8.42
強化深入
首先,讓我們編輯Script Task 2和Script Task 4中的Public Sub Main()如下所示:

    Public Sub Main()        Dim sTaskName As String = Dts.Variables("TaskName").Value.ToString        Dim iResponse As Integer        iResponse = MsgBox("Succeed " & sTaskName & "?", _                           MsgBoxStyle.YesNo + MsgBoxStyle.Question, _                           sTaskName & " Success Question")        If iResponse = vbYes Then            Dts.TaskResult = ScriptResults.Success        Else            Dts.TaskResult = ScriptResults.Failure        End If    End Sub

代碼8.2
代碼為每一個指令碼任務建立提示任務是否成功。編輯Script Task 4和Script Task 3之間的優先順序條件約束,設定求值運算為"運算式和約束",值設定為失敗,運算式設定為@MyBool

圖8.43
編輯Script Task 2和Script Task 3之間的優先順序條件約束,設定求值運算為"運算式",運算式設定為[email protected]

圖8.44
如果兩個優先順序條件約束的ShowAnnotation屬性都設定為ConstraintOptions,你的控制流程看起來應該8.45所示:

圖8.45
注意,將求值運算設定為運算式會引起ConstraintOptions顯示為"完成和運算式"。正如文章的前面提到,這是符合邏輯操作的。
執行包,條件選擇Script Task 4為失敗(否),Script Task 2為成功(是):

圖8.46
This is a trick question.Script Task 3永遠不會執行。因為優先順序條件約束的多重約束設定為"邏輯與"。所有約束的值都必須為True才會允許Script Task 3執行。但是它們含有對SSIS變數MyBool的互斥條件:一個約束當MyBool為True時為真,另一個約束當MyBool為Flase時為真。MyBool不可能同時為True和Flase.如果存在互斥條件,你必須將相應的多重約束設定為"邏輯或"。
讓我們編輯Script Task 2和Script Task 3之間的優先順序條件約束,修改運算式為@MyBool:

圖8.47
修改SSIS變數MyBool的值為True:

圖8.48
如果我在BIDS調試器執行包,條件選擇Script Task 4為失敗,Script Task 2為成功/失敗;Script Task 3就會執行:

圖8.49
一旦我們移除互斥條件,設定為邏輯與的多重約束就會為真,然後執行下面的任務。
Another "Gotcha"
之前我們禁用了序列容器。現在讓我們禁用Script Task 4:

圖8.50
當我們在BIDS調試器下執行包,Script Task 4不會執行,但是Script Task 3也不會執行:

圖8.51
為什嗎?MyBool的值為True而且Script Task 2完成。Script Task 4直接跳過去了。當Script Task 4禁用後,控制流程斷言它是成功的。這就意味著失敗優先順序條件約束不會進行求值。
總結
這一篇,我們使用SSIS變數控制優先順序條件約束的求值,檢查多重約束,and took a look at a couple “gotchas” to avoid when configuring precedence constraints to control workflow in an SSIS package.

第八篇 Integration Services:進階工作流程管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.