微軟BI 之SSIS 系列 - Precedence Constraint 詳解優先約束的使用


開篇介紹

Precedence Constraint 優先約束 - 在控制流中使用,用來鏈接控制流中各種 Task,Container,並且要求滿足一定的條件才能執行相關聯的 Task 或者 Container。 比如下圖中,第一個 Execute SQL Task 叫做 Precedence-Executable 優先可執行任務,而Script Task 由於在關聯箭頭的下游,所以它叫做 Constrained-Executable 受約束可執行任務。關聯箭頭的上游任務自然先執行,關聯箭頭下方的這種受約束可執行任務是否能夠被執行則要取決於 Precedence Constraint 的配置了。
EST_SELECT_VALUE 中的配置 - 
查詢的結果賦值給一個字符串類型的變量,Script Task 就是顯示一下這個變量的值而已。
雙擊綠色的線之后默認可以看到下面的這個配置,其中包括了約束與多約束的選項和配置。
  1. Evlaution Operation = Constraint  按上游 Task 執行結果決定是否執行下游 Script Task 任務(按執行結果約束)
  2. Value = Success  上游任務 EST_SELECT_VALUE 執行成功后才執行下游 Script Task 
EST_SELECT_VALUE 執行成功后自動執行 SCE_SHOW_RESULT

Value = Failure上游任務 EST_SELECT_VALUE 執行失敗后才執行下游 Script Task 

新建一個 SCR_SHOW_ERROR Script Task,里面不做任何操作。
修改 EST_SELECT_VALUE 與 SCR_SHOW_ERROR 之間的連接線,改成 Failure。
將 EST_SELECT_VALUE 中的 SQL 語句改成 SELECT 1/0 AS A,這樣會發生一個除數為零的錯誤,但是 SCR_SHOW_ERROR 是可以被執行到的。

Value = Complete 上游任務 EST_SELECT_VALUE 無論執行成功或者失敗,只要執行完畢就執行下游 Script Task 

新建一個 Script Task - SCR_SHOW_COMPLETE,里面不做任何操作。
修改連接線為 Complete。
當 SQL 語句為 SELECT 1/0 AS A  EST_SELECT_VALUE 執行失敗時,它被執行到了。
當 SQL 語句為 SELECT 1 AS A  EST_SELECT_VALUE 執行成功時,它也被執行到了。

Evlaution Operation = Expression  按表達式約束,與上游任務執行成功與否的結果無關

添加兩個 Script Task - SCR_SHOW_EXP_EMPTY 和 SCR_SHOW_EXP_VALUE。
SCR_SHOW_EXP_EMPTY 的約束配置 -
SCR_SHOW_EXP_VALUE 中的約束配置 -
當 EST_SELECT_VALUE 中的 SQL 為 SELECT 1 AS A 時,PV_RESULT 的值為1,且 EST_SELECT_VALUE 執行成功!
當 EST_SELECT_VALUE 中的 SQL 為 SELECT 1/0 AS A 時,PV_RESULT 的值不能從 EST_SELECT_VALUE 中正常接受,使用默認值 "",且 EST_SELECT_VALUE 執行失敗!
可見 SCR_SHOW_RESULT,SCR_SHOW_ERROR,SCR_SHOW_COMPLETE 是否執行只與 EST_SELECT_VALUE 執行的結果有關( Success,Failure,Complete),而與表達式無關。
而 SCR_SHOW_EXP_EMPTY 和 SCR_SHOW_EXP_VALUE 的執行只與表達式相關,而與 EST_SELECT_VALUE 的執行結果無關。

執行結果 AND 表達式 和 執行結果 OR 表達式

新添加四個 Script Task
SCR_SHOW_SUCCESS_&_EMPTY 中的配置要求 Expression 與 Constraint 同時成立。
SCR_SHOW_SUCCESS_OR_EMPTY 中的配置要求 Expression 與 Constraint 有一個成立。
SCR_SHOW_FALIURE_&_VALUE 中的配置要求 Expression 與 Constraint 同時成立。
SCR_SHOW_FALIURE_OR_VALUE 中的配置要求 Expression 與 Constraint 有一個成立。
當 EST_SELECT_VALUE 中的 SQL 為 SELECT 1/0 AS A 時,執行狀態 = Failure,PV_RESULT 為 EMPTY 空字符串。
所以 SRC_SHOW_SUCCESS_OR_EMPTY 滿足 PV_RESULT =="" 條件,而 SCR_SHOW_FAILURE_OR_VALUE 滿足 執行結果 = Failure。
當 EST_SELECT_VALUE 中的 SQL 為 SELECT 1 AS A 時,執行狀態 = Success,PV_RESULT 為 1。
所以 SRC_SHOW_SUCCESS_OR_EMPTY 滿足執行狀態 = SUCCESS 條件,而 SCR_SHOW_FAILURE_OR_VALUE 滿足 PV_RESULT !=""。

多約束的情況

SCR_ALL_TRUE 受 EST_SELECT_VALUE_1 和 EST_SELECT_VALUE_2 共同影響。
默認情況下 SCR_ALL_TRUE 的兩個優先約束都是如下圖所示,這種多約束的情況要表示的意思是。從 EST_SELECT_VALUE_1 到 SCR_ALL_TRUE 只有一個結果就是 True 或者 False,這個 True 或者 False 是由 EST_SELECT_VALUE_1 中的 Constraint/Expression/Constraint and Expression/Constraint or Expression 最終結果得到的 - True 或 False。同樣 EST_SELECT_VALUE_2 也能得到一個最終的計算結果 - True 或 False。
也就是說有多個條件約束對 SCR_ALL_TRUE 起約束作用,那么如何實現兩種約束共同作用於 SCR_ALL_TRUE 呢?就是下面的 Multiple Constraints 中的 Logical AND 或者 Logical OR 選項來決定的了。

測試條件 1

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1 AS A
  3. Logical AND (雖然是兩條約束線,但是更改其中一條,另外一條也會自動更改,也就是說必須同時為 Logical AND 或者 Logical OR)。

測試條件 2

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A
  3. Logical AND

測試條件 3

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A
  3. Logical OR
線條同時變為虛線,執行成功!

測試條件 4

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0   AS A  (Constraint - Completion)
  3. Logical OR
線條同時變為虛線,執行成功!

測試條件 5

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0   AS A  (Constraint - Completion)
  3. Logical AND  執行成功!

PS 小竅門

為了更清楚的知道條件表達式和約束的內容,我們可以通過設置約束線的屬性讓這些信息顯示出來,而不是通過人工注釋的方式。
選中 Constraint 線,修改其 ShowAnnotation 屬性,將 AsNeeded 修改為 ConstraintOptions。
這樣就可以清楚的看到約束中的狀態判斷和表達式判斷了!

總結

以上就是 Precedence Constraint 的全部內容!雖然感覺內容比較多,但是這些配置條件在不同的情形中的確會碰到。比如在文件歸檔任務中,就有類似於這樣的條件約束。一種是只要前面加載數據成功就歸檔,一種是不管前面數據加載成功不成功只要執行完畢就執行歸檔操作。

更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)  如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM