介绍

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

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

关于变量

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

图 1

Variables 窗口显示如下:

图 2

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

添加变量按钮 -

删除变量按钮 -

移动变量按钮 -

变量过滤还有列选择 - 

图 3

变量与命名空间

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

添加一个值

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

图 4

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

图 5

表达式及优先约束

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

图 6

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

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

图 10

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

图 12

我们执行下SSIS包 :

图 13

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

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

图 14

图 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;
}

再次运行包:

图 16

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

图 17

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

图 18

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

图 20

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

图 21

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

Figure 22

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

图 23

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

图 25  选yes  Script  Task2 执行

图 26 选no  Script Task3 执行

Copying and Disabling to Preserve Existing Work

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

图 28

然后复制一个 Sequence container ;

图 29

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

图 30

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

多约束 (Multiple Constraints)

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

图 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 选项:

图 32

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

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

图 33

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

图 34

优先约束变为虚线:

图 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 :

图 37

注意  MyBool 设置为 False:

图 38

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

图 39

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

图 40

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

图 41

优先约束注释(Precedence Constraint Annotation )

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

图 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之间的优先约束 :

图 44

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

Figure 45

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

图 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 执行成功.

图 47

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

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

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

项目文件: My_First_SSIS_Project_SSIS_Level8.7z

[译]Stairway to Integration Services Level 8 - SSIS 工作流管理高级的更多相关文章

  1. [译]Stairway to Integration Services Level 7 - SSIS 工作流管理中级

    介绍 前一个章节我们对SSIS的优先约束做了初步了解,并且实验了MaxConcurrentExecutables 包属性的设置. 本文将测试“On Success”, “On Completion”, ...

  2. [译]Stairway to Integration Services Level 6 - SSIS 工作流管理基础

    简介 在之前的章节中,我们学习了增量载入数据. 本文中.我们通过优先约束(Precedence Constraints)来管理SSIS的工作流. 添加一个SSIS包 图 1 将新建的Package1. ...

  3. [译]Stairway to Integration Services Level 13 - SSIS 变量回顾

    介绍 在前一篇中我们组合了已经学过的事件冒泡 event bubbling, 日志记录 logging, 和父子模型 Parent-Child pattern 建立了自定义的SSIS包日志记录. 本文 ...

  4. [译]Stairway to Integration Services Level 15 – SSIS 参数回顾

    介绍 在本文中我们会研究SSIS变量姐妹: SSIS 变量. 我们会演示参数配置,通过包参数管理动态属性值,然后会演示SSIS包执行的时候参数怎么被配置的. SSIS Parameters 101 S ...

  5. [译]Stairway to Integration Services Level 16 – Flexible Source Locations (多文件导入)

    介绍 在本文中我们将利用SSIS参数,变量 以及 Foreach Loop Container 从多个源动态导入数据. 开始前我们先下载一些数据.WeatherData_Dec08_Apr09.zip ...

  6. [译]Stairway to Integration Services Level 12 - 高级日志配置

    介绍 本文中,我们将结合之前学习的时间冒泡,日志记录,以及复制模型.建立一个自定义的SSIS包日志模型. SSIS Task事件回顾    Reviewing SSIS Task Events 在做实 ...

  7. [译]Stairway to Integration Services Level 9 - Control Flow Task Errors

    介绍 在本文中,我们会实验 MaximumErrorCount和ForceExecutioResult 故障容差属性,并且还要学习Control Flow task errors, event han ...

  8. [译]Stairway to Integration Services Level 18 – 部署和执行

    介绍 在本文中,我们要创建一个SSIS Catalog 实例,部署我们的项目,并且运行 weather data loader 包. SSIS 2012 部署模型   SSIS 2012 Deploy ...

  9. [译]Stairway to Integration Services Level 11 - 日志配置

    介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...

随机推荐

  1. codeforces 546E. Soldier and Traveling 网络流

    题目链接 给出n个城市, 以及初始时每个城市的人数以及目标人数.初始时有些城市是相连的. 每个城市的人只可以待在自己的城市或走到与他相邻的城市, 相邻, 相当于只能走一条路. 如果目标状态不可达, 输 ...

  2. Java中的枚举类型详解

    枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...

  3. Date对象需要注意的点

    var today=new Date(); Date对象取得了PC内部时钟的一个快照,并同时返回一个Date对象实例. 注意静态Date对象和Date对象实例的差别,后者包含一个实际的日期值.毫秒为单 ...

  4. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  5. STL内存配置器

    一.STL内存配置器的总体设计结构 1.两级内存配置器:SGI-STL中设计了两级的内存配置器,主要用于不同大小的内存分配需求,当需要分配的内存大小大于128bytes时, 使用第一级配置器,否则使用 ...

  6. POJ 2823 Sliding Window 【单调队列】

    题目链接:http://poj.org/problem?id=2823 题目大意:给出一组数,一个固定大小的窗体在这个数组上滑动,要求出每次滑动该窗体内的最大值和最小值. 这就是典型的单调队列,单调队 ...

  7. ListBox控件的操作与实现

    .NET FrameWork>參考>类库>System.Windows.Forms>ListBox类的属性 1. 属性列表:     SelectionMode     组件中 ...

  8. Tomcat从零开始(十)Loader

    第十课: 不知不觉就10篇blog了,说实话,我是第一次更这么长时间的Blog. 嗯,今天说说Loader,在以前的课程中,也就是内个能使用最初级的servlet的那一节,我们使用了URLClassL ...

  9. SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释

    一.SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释:根据datatable名填充Dataset.myda.Fill(ds, ...

  10. POJ 2142:The Balance_扩展欧几里得(多组解)

    先做出两个函数的图像,然后求|x|+|y|的最小值.|x|+|y|=|x0+b/d *t |+|y0-a/d *t| 这个关于t的函数的最小值应该在t零点附近(在斜率大的那条折线的零点附近,可以观察出 ...