zoukankan      html  css  js  c++  java
  • [译]Stairway to Integration Services Level 8

    介绍

    在前两个章节我们,建立了一个新的SSIS包,简单的使用了一下scripting还有优先约束,并且测试了MaxConcurrentExecutables 属性.  同时实验了  “On Success”, “On Completion”, 和“On Failure”几种类型的优先约束.

    本文中我们继续深入SSIS工作流管理,学习SSIS变量并且通过表达式来处理复杂的优先约束. 

    关于变量 

    打开 Precedence.dtsx package,菜单栏点SSIS下拉菜单,然后选Variables. 

    image

    图 1

    Variables 窗口显示如下:

    image

    图 2

    在 Variables 窗口顶端,有一个工具栏,按钮如下:

    添加变量按钮 - image

    删除变量按钮 - image

    移动变量按钮 - image

    变量过滤还有列选择 -  image

    image

    图 3

    变量与命名空间

    再SSIS包中默认有两个命名空间: System 和 User. 你没法增加System的变量. 不过你可以添加新的User 变量或者新建一个命名空间. 新建命名空间需要显示 namespace字段,然后修改字段文本即可 .

    添加一个值

    为了做演示,让我们添加一个SSIS变量 . :

    image

    图 4

    重命名变量名为 “MyBool” 然后把数据类型改为 Boolean,如下图:

    image

    图 5

    表达式及优先约束

    右击 Script Task 1 和 Script Task 2之间的优先约束,然后点击”Edit..”:

    image

    图 6

    我们看到两个groupbox . 一个是“Constraint options” 和“Multiple constraints”.

    把 “Evaluation operation”修改为to “Expression” 然后把r “@MyBool” 输入到 Expression 文本框:

    image

    图 10

    注意,布尔变量MyBool 的默认值是False .  此外写入Expression 文本框的表达式结果必须为布尔值(True 或 False ). :

    image

    图 12

    我们执行下SSIS包 :

    image

    图 13

    因为这次优先约束只判断 变相@MyBool. 而变量 @MyBool 默认为 False ,所以Script Task 2 永远不会执行.

    接着做更多测试. 打开 Script Task 1  编辑器. 点击  ReadWriteVariables 属性. 然后选择. User::MyBool variable 变量 :

    image

    图 14

    image 

    图 15

    点击Edit Script按钮输入以下代码  

    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

    C#版

    public void Main()
            {
                // TODO: Add your code here
                string sTaskName = Dts.Variables["TaskName"].Value.ToString();
                DialogResult iResponse = MessageBox.Show("Succeed" + sTaskName + "?", sTaskName, MessageBoxButtons.YesNo);
    
                if (iResponse == DialogResult.Yes)
    
                    Dts.Variables["User::MyBool"].Value = true;
                else
                    Dts.Variables["User::MyBool"].Value = false;
            }

    再次运行包:

    image

    图 16

    如果你点了Yes ,那么会看到Script Task2 执行后弹出的消息框 :

    image

    图 17

    如果选择No 的话.  executing Script Task 2 就不会执行 :

    image

    图 18

    让我们再做复杂点的测试 . 拷贝 Script Task2 然后改名为 Script Task 3 . 并且连接个新的优先约束.

    image

    图 20

    再次执行, 无论你选择Yes或No, Script Task1 都会成功. 执行成功后. 连接 Script Task1 和 Script Task3的优先约会就会为真. 然后出现消息框. :

    image

    图 21

    然后我们修改 Script Task 1  和 Script Task 3 之间的优先约束. Expression里面打上 !@MyBool”:

    image

    Figure 22

    “!@MyBool” 也就是“Not MyBool” 如果User::MyBool 是False 那验证结果就是True ,反之亦然. :

    image

    图 23

    再次运行. 结果就是选Yes的时候Script Task2 执行 Script Task3 不执行, 反过来就是 Script Task2 不执行,Script Task3 执行:image

    图 25  选yes  Script  Task2 执行

    image

    图 26 选no  Script Task3 执行

    Copying and Disabling to Preserve Existing Work

    在继续之前, 从Toolbox里面拖个 Sequence Container 先把他们保存起来 . :

    image

    图 28

    然后复制一个 Sequence container ;

    image

    图 29

    右击 Sequence Container .点击 Disable.  此时里面的组件都是会是禁用状态:

    image

    图 30

    此时原先做完的工作已经保存起来,现在让我们进一步研究.

    多约束 (Multiple Constraints)

    在Sequence Container 1中删掉 Script Task 1.  然后复制 Script Task 2 并改名为“Script Task 4”. 移动 Script Task 2 和 Script Task 4 使他们平行.  自后建立他们之间的优先约束,如下图:

    image

    图 31

    现在有个问题. 怎么样才会使得 Script Task3 执行? 

    1. 只要另外两个task执行, 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 不会执行.

    这个结果,取决于, 优先约束的  Multiple Constraints 选项:

    image

    图 32

    Multiple Constraints 作用于连接EndPoint 所有优先约束. 当只有一个优先约束练级的时候,这个选项无意义.但是有多个优先约束的时候,SSIS就会进行判定.

    “Logical AND” 为默认选项, 所有连接这个endpoint的优先约束在endpoint 这个task执行之前都要进行验证. 本咧,这意味着 Script Task 4 Script Task 2  必须成功执行, Script Task 3 才会执行:

    image

    图 33

    接着我们把Logical AND 改为 Logical OR :

    image

    图 34

    优先约束变为虚线:

    image

    图 35

    因为endpoint 涉及多个 优先约束, 只要改了一个Multiple Constraints的选项,其他几个会同时修改.

    如果选择了  configured to Logical AND, 所有优先约束必须先验证才能执行后续流程.  现在我们改为了Logical OR. 那么执行Script Task3前会发生什么 ?

    其他task执行 Script Task 3 就会执行. 

    1. Script Task 4 执行成功或者Script Task 2 执行成功 那么 Script Task 3 就会执行.
    2. Script Task 4 和 Script Task 2 均执行成功以后 Script Task 3 才会执行.
    3. Script Task 3 不会执行.

    然我们测试一下,看看什么结果:

    答案是2 Script Task 4 执行成功或者Script Task 2 执行成功 那么 Script Task 3 就会执行 (这边和我最新版SSDT执行的次序不一样,据说并行这边有个设置.回头看看).

    混合约束和表达式

    打开Script Task 4 和 Script Task 3 之间优先约束 . 把 multiple constraints 改为Logical AND. 设置 Evaluation Operation 为“Expression and Constraint”.  Expression 填写 @MyBool :

    image

    图 37

    注意  MyBool 设置为 False:

    image

    图 38

    这么设置的话 优先约束检测永远不会为True . 因为除了前两个任务要执行成功以外 表达式也需要为Ture .但是表达式 MyBool的值是False 所以优先约束检测不会成功:

    image

    图 39

    接着把Evaluation Operation 改为 “Expression or Constraint” :

    image

    图 40

    再次运行,由于是逻辑or的关系,所以Script Task3 执行了:

    image

    图 41

    优先约束注释(Precedence Constraint Annotation )

    点击任意优先约束,然后在属性窗口的ShowAnnotation 选项进行注释选择 :

    image

    图 42

    让混合来的更猛烈些(Mixing It Up!)

    修改 Script Task 2 和 Script Task 4 相应的脚本代码 :

    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

    C# 版

    public void Main()
            {
                // TODO: Add your code here
                string sTaskName = Dts.Variables["TaskName"].Value.ToString();
                DialogResult iResponse = MessageBox.Show("Succeed" + sTaskName + "?", sTaskName, MessageBoxButtons.YesNo);
    
                if (iResponse == DialogResult.Yes)
    
                    Dts.TaskResult = (int)ScriptResults.Success;
                else
                    Dts.TaskResult = (int)ScriptResults.Failure;
                
            }

    设置 Script Task 4 与 Script Task 3之间的优先约束 :

    image

    图 44

    修改Script Task 2 与 Script Task 3 之间的优先约束,如下:

    image

    Figure 45

    如果 ShowAnnotation 属性设置为 ConstraintOptions, 那么控制流应该和下面显示一样:

    image

    图 46

    那么Script Task 3  会不会执行呢?

    1. 其他任务执行了 Script Task 3也会执行.
    2. Script Task 4或者 Script Task2 执行成功那么 Script Task 3就会执行.
    3. Script Task4 ,Script 2 均执行成功后, Script Task 3 就会执行 .
    4. Script Task 3 永远不会执行.

    我们才测试一下, 下面截图是其中一种执行方式 . Script  Task4 执行失败  ,Script Task2 执行成功.

    image

    图 47

    答案是4 Script Task 3 永远不会执行.原因是两个优先约束判断相互冲突.也就是说两边的MyBool 判断不会都为True 或者 False

    后面内容比较罗嗦多余.我就不翻了.有兴趣的朋友请看原文链接

    原文地址 : http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/92901/

    项目文件: My_First_SSIS_Project_SSIS_Level8.7z

  • 相关阅读:
    挑战编程 uva100 3n+1
    《算法问题实战策略》 BOGGLE
    图论 最短路专辑
    acwing 76. 和为S的连续正数序列
    leetcode 19 删除链表的倒数第N个节点
    水文一篇 汇报下最*的学**况
    acwing 81. 扑克牌的顺子
    Solr基础理论与维护管理快速上手(含查询参数说明)
    Solr基础理论与维护管理快速上手(含查询参数说明)
    利用SolrJ操作solr API完成index操作
  • 原文地址:https://www.cnblogs.com/haseo/p/4024370.html
Copyright © 2011-2022 走看看