開篇介紹
Precedence Constraint 優先約束 - 在控制流中使用,用來連接控制流中各類 Task,Container,而且要求知足必定的條件才能執行相關聯的 Task 或者 Container。 好比下圖中,第一個 Execute SQL Task 叫作 Precedence-Executable 優先可執行任務,而Script Task 因爲在關聯箭頭的下游,因此它叫作 Constrained-Executable 受約束可執行任務。關聯箭頭的上游任務天然先執行,關聯箭頭下方的這種受約束可執行任務是否可以被執行則要取決於 Precedence Constraint 的配置了。
EST_SELECT_VALUE 中的配置 -
查詢的結果賦值給一個字符串類型的變量,Script Task 就是顯示一下這個變量的值而已。
雙擊綠色的線以後默承認以看到下面的這個配置,其中包括了約束與多約束的選項和配置。
- Evlaution Operation = Constraint 按上游 Task 執行結果決定是否執行下游 Script Task 任務(按執行結果約束)
- 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
- EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
- EST_SELECT_VALUE_2 - SQL = SELECT 1 AS A
- Logical AND (雖然是兩條約束線,可是更改其中一條,另一條也會自動更改,也就是說必須同時爲 Logical AND 或者 Logical OR)。
測試條件 2
- EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
- EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A
- Logical AND
測試條件 3
- EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
- EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A
- Logical OR
線條同時變爲虛線,執行成功!
測試條件 4
- EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
- EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A (Constraint - Completion)
- Logical OR
線條同時變爲虛線,執行成功!
測試條件 5
- EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
- EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A (Constraint - Completion)
- Logical AND 執行成功!
PS 小竅門
爲了更清楚的知道條件表達式和約束的內容,咱們能夠經過設置約束線的屬性讓這些信息顯示出來,而不是經過人工註釋的方式。
選中 Constraint 線,修改其 ShowAnnotation 屬性,將 AsNeeded 修改成 ConstraintOptions。
這樣就能夠清楚的看到約束中的狀態判斷和表達式判斷了!
總結
以上就是 Precedence Constraint 的所有內容!雖然感受內容比較多,可是這些配置條件在不一樣的情形中的確會碰到。好比在文件歸檔任務中,就有相似於這樣的條件約束。一種是隻要前面加載數據成功就歸檔,一種是無論前面數據加載成功不成功只要執行完畢就執行歸檔操做。
更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 若是以爲這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。html