介绍

在前两个章节我们,建立了一个新的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. 运行SPL Streams debugger(sdb)的两种方法

    You can use the SPL Streams Debugger in InfoSphere® Streams Studio to help you debug your SPL applic ...

  2. 星际SC 地图 Big Game Fort 要塞之战 修正了 BIG GAME 地图的平衡性

    星际SC 地图 Big Game Fort 要塞之战 修正了 BIG GAME 地图的平衡性 也适合BIG 1V1 对战 此版本目前不开放1打1造功能

  3. Ubuntu Server 14.04在VMware安装的一些事儿

    这几天一直在折腾Ubuntu Server 14.04,故记录下: 安装前的准备: 1.建议安装英文版,像15.04.16.04等安装中文版时存在bug,而且中文版字体显示也有问题. 2.Ubuntu ...

  4. Oracle 数据库导入、导出

    第一步:新建一个txt文件: exp.exe jeamsluu@test file=d:\daochu.dmp log=1.log 另存为.bat格式的文件 第二步:双击运行:此时会弹出输入口令的对话 ...

  5. 关于Android Launcher图标上面动态改变数字的实现

    由于项目需要使用到类似小米应用商店的图标数字提示功能,谷歌百度了许多文章都没看到有真正意义上的实现(没有在国外网站上搜索),有实现在APP内部的一个ImageView上面更新数字的,当然这种太简单无非 ...

  6. linux 在终端中打开图形化文件管理器

    虽然终端十分强大,但在少数使用终端的时候,会突然需要图形化文件管理器的帮忙. 命令: xdg-open "dir" 例如 xdg-open ./ 用图形化文件管理器打开当前文件夹 ...

  7. android 视频播放器的INTENT-FILTER属性

    <intent-filter>                   <action android:name="android.intent.action.VIEW&quo ...

  8. 嵌入式系统 Boot Loader

    基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念.软件设计的主要任务以及结构框架等内容.

  9. Grunt的配置和使用(一)

    Grunt的配置和使用(一) Grunt 和 Grunt 的插件都是通过 Node.js 的包管理器 npm 来安装和管理的.为了方便使用 Grunt ,你应该在全局范围内安装 Grunt 的命令行接 ...

  10. HTML5API___Web Storage

    Web Storage 是html5的本地存储规范 支持:移动平台基本支持 (opera mini除外) ie8+ff chrome 等 支持 它包含2个: sessionStorage 会话存储   ...