• [译]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

  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/haseo/p/4024370.html
Copyright © 2020-2023  润新知