本篇文章是Integration Services系列的第六篇,详细内容请参考原文


简介
在前几篇文章中,我们关注使用增量加载方式加载数据。在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作流。你将添加一个新SSIS包到已存在的解决方案。
添加SSIS包
SSIS控制流包含任务、容器和优先约束。在SSIS控制流中任务和容器是可执行对象,优先约束用于控制任务和容器何时/是否执行。
为了操作控制流,打开叫做My_First_SSIS_Project解决方案。打开后在解决方案资源管理器右击SSIS包虚拟文件夹,选择新建SSIS包,如图6.1所示:

图6.1 新建SSIS包
当你点击新建SSIS包时一个名叫Package1.dtsx的包就会创建。右击Package1.dtsx选择重命名,如图6.2所示:

图6.2 重名称包名
包进入了重命名模式,如图6.3所示。重命名包为Precedence.dtsx

图6.3 键入包名
在你键入包名按回车键后,你会被提醒是否要同时重命名包对象?

图6.4 重命名包对名提醒
解决方案资源管理器下显示的SSIS包代表的是Solution\Project文件夹下叫做Package1.dtsx的文件,以及BIDS中的包对象(实际上单击SSIS包虚拟文件夹下的某个包,在属性中看到的信息就存储在文件夹的信息;双击SSIS包虚拟文件夹下的某个包,在属性中看到的就是BIDS中的信息)。当你看到图6.4的提示,你已经重命名文件夹下的文件;这个提示是询问是否需要重命名BIDS中的包对象。帮自己一个忙,通常点击“是”按钮。如果你选择“否”,你的文件和包对象将会不同名,这可能容易混淆。
添加一个脚本任务
缺少优先约束也是可行的,我们将在第一个演示中看到。首先让我们从控制流工具箱添加一个脚本任务到控制流。

图6.5 添加一个脚本任务到控制流
脚本任务可以说是SSIS中最强大的控制流任务。你可以使用它来创建其他SSIS任务的大部分功能。你也可以使用脚本任务添加新功能到的SSIS控制流。
右击脚本任务选择编辑,打开脚本任务编辑器:

图6.6 脚本任务编辑器
在这篇文章我们不会彻底探讨脚本任务的功能,但我们以它来开始。第一个你要检查的属性是ScriptLanguage.你可以选择Visual Basic或C#作为脚本任务中的编辑语言。你可以通过右侧的下拉菜单更改脚本任务的默认语言。我比较喜欢使用Visual Basic

图6.7 选择脚本语言
点击常规页,将Name属性更改为“Script Task 1”

图6.8 更改Name属性
回到脚本页,点击ReadOnlyVariables属性,文本框的右侧将出现一串省略号

图6.9 修改ReadOnlyVariables属性
点击省略号显示选择变量列表。我不喜欢列表显示的方式,我希望复选框和变量名称离得近些。我可以通过双击列表顶部复选框与名称的分隔栏来调整列宽。选择“System::TaskName”变量:

图6.10 选择变量
一旦你点击确定,脚本任务的ReadOnlyVariables属性如图6.11所示

图6.11 修改后的ReadOnlyVariables属性
为了我们的目的,单击“编辑脚本”按钮打开ssisscript如图12所示:

图6.12 ssisscript-Integration Services脚本任务
滚动鼠标直到你看到Public Sub Main().将下面代码添加到子程序:

        Dim sTaskName As String = Dts.Variables("TaskName").Value.ToString
MsgBox(sTaskName & " completed.")

你的代码看起来应该和图6.13相似:


图6.13 添加代码到Public Sub Main()
这段代码用来做什么呢?第一条语句在VB中创建一个字符串类型的sTaskName变量。当sTaskName创建时会分配一个值。这个值是由脚本任务的ReadOnlyVariables属性中的"“System::TaskName"变量分配。我们通过访问Dts命名空间的变量集合得到SSIS变量值,这就是“Dts.Variables”部分。接着是SSIS变量的名称——TaskName——用双引号引用,这就是("TaskName")部分。
我们接下来要获取值的属性,它是一个对象。因为它是一个对象,我们必须将属性转换成字符串以将它分配给字符串变量。我们通过ToString方法实现。
这就是如何将SSIS变量的值转到脚本任务变量(VB语言)。
下一行显示一个弹出消息框包含的任务的名字(sTaskName变量的值+" completed."字符串)。
直接点击右上角的红"X"关闭脚本任务代码编辑器。脚本会自动保存。点击确定按钮完成脚本任务配置。
我们准备测试一下。按下F5在调试器下启动SSIS包。你应该看到类似图10.14消息对话框:

图6.14 消息对话框
点击停止按钮停止调试
添加第二个脚本任务
右击Script Task 1选择复制,然后在控制流的空白处右击选择粘贴。一个新的脚本任务添加到控制流,名称是"Script Task 1 1",重命名新脚本任务为"Script Task 2"

图6.15 添加新脚本任务
在SSIS调试器下重新执行SSIS包。应该显示两个消息对话框(更可能是一个叠加在另一个上):

图6.16 执行SSIS包
因为脚本任务的名称(System::TaskName变量)显示在消息对话框,我们可以操作更多的复制和粘贴。停止调试。
Use Cases 0 and 1
前面的示例就是一个"use case"例子。这种use case演示了没有优先约束时会发生什么。我把它称作"use case 0".对于use case 1,让我们在Script Task 1和Script Task 2之间添加一个优先约束。为了完成这个,首先点击Script Task 1,在其下方会出现一个绿箭头的优先约束,点击优先约束并将它拉到Script Task 2.很多人试图刚好抵达下一个任务的边缘,不要这样!直接将优先约束拉到下一个任务的中间。

图6.17 添加优先约束
在SSIS调试器执行包,注意Script Task 1先执行:

图6.18 Script Task 1先执行
点击确定按钮完成Script Task 1.然后,Script Task 2开始执行

图6.19 Script Task 2后执行
注意Script Task 2要在Script Task 1完成后才执行。另外注意:这里的优先约束是默认的"成功"类型。意味着前面的任务(Script Task 1)必须完成并且成功才会执行后面的任务。
这里的语义是很重要的。优先约束起始于Script Task 1终止在Script Task 2。起始任务连接到优先约束的起点——有一个半圆点,它连接到起始任务;终点有一个箭头,它连接到终止任务。
优先约束求值。他们测试一个或多个条件,如果条件为真,约束允许终止任务开始执行。
"单线程"
"Single-threading" is one way to describe doing one thing at a time.使用优先约束是让SSIS控制流"单线程"的方式之一。使用优先约束是控制流中确定工作流的唯一方式。
在SSIS控制流中工作流是否有可能不明确?当然。为了演示,右击Script Task 1和Script Task 2之间的优先约束,然后选择删除。在控制流的空白单击一下然后按F4显示包属性。MaxConcurrentExecutables属性控制着在SSIS控制流有多少可执行文件可以同时执行。默认是设置为-1。默认值允许(CPU内核数+2)个可执行文件同时执行。例如,如果你有一四核服务器SSIS将允许六个并发执行。
将MaxConcurrentExecutables的属性设置成1,如图6.20所示:

图6.20 设置MaxConcurrentExecutables的属性
重新执行SSIS包。现在,每一次只有一个脚本任务执行。该顺序是不确定的,因此不可预测的。
停止调试,将MaxConcurrentExecutables设置回-1并保存SSIS包。
总结
在这篇文章中,我们在解决方案中添加了一个新的SSIS包,建立了我们的第一个脚本任务,它们之间通过一个成功优先约束连接。我们学习从SSIS脚本任务读取SSIS变量的值,以及MaxConcurrentExecutables属性。在下一篇,我们将看到更多SSIS优先约束的特点。

【译】第六篇 Integration Services:初级工作流管理的更多相关文章

  1. 第六篇 Integration Services:初级工作流管理

    本篇文章是Integration Services系列的第六篇,详细内容请参考原文. 简介在前几篇文章中,我们关注使用增量加载方式加载数据.在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作 ...

  2. 【译】第九篇 Integration Services:控制流任务错误

    本篇文章是Integration Services系列的第九篇,详细内容请参考原文. 简介在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentE ...

  3. 【译】第二篇 Integration Services:SSIS数据泵

    本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...

  4. 【译】第一篇 Integration Services:SSIS是什么

    本篇文章是Integration Services系列的第一篇,详细内容请参考原文. Integration Services是一种在SQL Server中最受欢迎的子系统.允许你在各种数据源之间提取 ...

  5. 【译】第七篇 Integration Services:中级工作流管理

    本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcur ...

  6. 【译】第八篇 Integration Services:高级工作流管理

    本篇文章是Integration Services系列的第八篇,详细内容请参考原文. 简介在前面两篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcu ...

  7. 第七篇 Integration Services:中级工作流管理

    本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcur ...

  8. 第八篇 Integration Services:高级工作流管理

    本篇文章是Integration Services系列的第八篇,详细内容请参考原文. 简介在前面两篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcu ...

  9. 【译】第十一篇 Integration Services:日志记录

    本篇文章是Integration Services系列的第十一篇,详细内容请参考原文. 简介在前一篇,我们讨论了事件行为.我们分享了操纵事件冒泡默认行为的方法,介绍了父子模式.在这一篇,我们会配置SS ...

随机推荐

  1. Delphi 判断一个字符串是否为数字

    //函 数 名: IsDigit//返 回 值: boolean//日       期:2011-03-01//参       数: String//功       能: 判断一个字符串是否为数字// ...

  2. Python实现双色球和大乐透摇奖

    实现代码: # code by kadycui # 模块引用 import random def select(): print('\n') print('请选择彩票种类') print('双色球输入 ...

  3. 多进程编程之用户ID和用户组ID

      实际用户ID(real user id):用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的uid:(实际用户组ID类似) 有效用户ID(effect ...

  4. java中new两个对象,在堆中开辟几个对象空间

    内存堆中有两个对象,两个对象里都有独立的变量.p1 p2指向的不是同一个内存空间. 也可以这样描述引用p1,p2指向两个不同的对象.

  5. NOIP2017 游记

    没考多好......并不知道该写什么...... 那就写写流水账...... DAY 0 上午到机房,众人全是打板子or颓废的....然后我打完板子去打印了个奇怪的背包九讲.... 然后大巴到德州东, ...

  6. git gitignore 如何添加,为何添加了无效

    需求:一个新项目源码要挂载在GIT服务器上,但是里面的obj文件夹,bin文件夹,.exe文件不提交(每次) 有两种情况出现 1.项目初始化的时候就加入拦截规则文件  gitignore 具体步骤请参 ...

  7. MT【141】逆用特征根法

    (清华大学THUSSAT) 已知 \(a=\left( \dfrac{-1+\sqrt{5}}{2} \right)^{-10}+\left( \dfrac{-1-\sqrt{5}}{2} \righ ...

  8. 前端学习 --Css -- 子元素的伪类

    :first-child 寻找父元素的第一个子元素,在所有的子元素中排序: :last-child 寻找父元素的最后一个子元素,在所有的子元素中排序: :nth-child 寻找父元素中的指定位置子元 ...

  9. 解题:POI 2008 Subdivision of Kingdom

    题面 还可以这么搜......学到了(PoPoQQQ orz) 我们最朴素的做法是枚举所有状态(当然可以剪,剪完最终实际状态量也是$C_{26}^{13}$的),然后每次$O(n)$扫一遍判断,大概会 ...

  10. fzyzojP2291 -- 小添添的庄园之道路修复

    直接换根dp f[i]表示,i为根的子树的方案 f[i]=Π(f[son]+1)(就是考虑这个边修不修(不修,子树中只有一种方案)) 这里是乘法 换根的时候,直接算的话,为了消除x对fa的贡献,要乘上 ...