微軟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 博客推薦欄中快速看到這些文章。html

相關文章
相關標籤/搜索