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


简介
在前几篇文章中,我们关注使用增量加载方式加载数据。在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作流。你将添加一个新SSIS包到已存在的解决方案。
添加SSIS包
SSIS控制流包含任务、容器和优先约束。在SSIS控制流中任务和容器是可执行对象,优先约束用于控制任务和容器何时/是否执行。
为了操作控制流,打开叫做My_First_SSIS_Project解决方案。打开后在解决方案资源管理器右击SSIS包虚拟文件夹,选择新建SSIS包,如图6.1所示:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.1 新建SSIS包
当你点击新建SSIS包时一个名叫Package1.dtsx的包就会创建。右击Package1.dtsx选择重命名,如图6.2所示:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.2 重名称包名
包进入了重命名模式,如图6.3所示。重命名包为Precedence.dtsx
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.3 键入包名
在你键入包名按回车键后,你会被提醒是否要同时重命名包对象?
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.4 重命名包对名提醒
解决方案资源管理器下显示的SSIS包代表的是Solution\Project文件夹下叫做Package1.dtsx的文件,以及BIDS中的包对象(实际上单击SSIS包虚拟文件夹下的某个包,在属性中看到的信息就存储在文件夹的信息;双击SSIS包虚拟文件夹下的某个包,在属性中看到的就是BIDS中的信息)。当你看到图6.4的提示,你已经重命名文件夹下的文件;这个提示是询问是否需要重命名BIDS中的包对象。帮自己一个忙,通常点击“是”按钮。如果你选择“否”,你的文件和包对象将会不同名,这可能容易混淆。
添加一个脚本任务
缺少优先约束也是可行的,我们将在第一个演示中看到。首先让我们从控制流工具箱添加一个脚本任务到控制流。
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.5 添加一个脚本任务到控制流
脚本任务可以说是SSIS中最强大的控制流任务。你可以使用它来创建其他SSIS任务的大部分功能。你也可以使用脚本任务添加新功能到的SSIS控制流。
右击脚本任务选择编辑,打开脚本任务编辑器:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.6 脚本任务编辑器
在这篇文章我们不会彻底探讨脚本任务的功能,但我们以它来开始。第一个你要检查的属性是ScriptLanguage.你可以选择Visual Basic或C#作为脚本任务中的编辑语言。你可以通过右侧的下拉菜单更改脚本任务的默认语言。我比较喜欢使用Visual Basic
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.7 选择脚本语言
点击常规页,将Name属性更改为“Script Task 1”
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.8 更改Name属性
回到脚本页,点击ReadOnlyVariables属性,文本框的右侧将出现一串省略号
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.9 修改ReadOnlyVariables属性
点击省略号显示选择变量列表。我不喜欢列表显示的方式,我希望复选框和变量名称离得近些。我可以通过双击列表顶部复选框与名称的分隔栏来调整列宽。选择“System::TaskName”变量:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.10 选择变量
一旦你点击确定,脚本任务的ReadOnlyVariables属性如图6.11所示
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.11 修改后的ReadOnlyVariables属性
为了我们的目的,单击“编辑脚本”按钮打开ssisscript如图12所示:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.12 ssisscript-Integration Services脚本任务
滚动鼠标直到你看到Public Sub Main().将下面代码添加到子程序:

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

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

【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图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消息对话框:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.14 消息对话框
点击停止按钮停止调试
添加第二个脚本任务
右击Script Task 1选择复制,然后在控制流的空白处右击选择粘贴。一个新的脚本任务添加到控制流,名称是"Script Task 1 1",重命名新脚本任务为"Script Task 2"
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.15 添加新脚本任务
在SSIS调试器下重新执行SSIS包。应该显示两个消息对话框(更可能是一个叠加在另一个上):
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图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.很多人试图刚好抵达下一个任务的边缘,不要这样!直接将优先约束拉到下一个任务的中间。
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.17 添加优先约束
在SSIS调试器执行包,注意Script Task 1先执行:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.18 Script Task 1先执行
点击确定按钮完成Script Task 1.然后,Script Task 2开始执行
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图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所示:
【译】第六篇 Integration Services:初级工作流管理-LMLPHP
图6.20 设置MaxConcurrentExecutables的属性
重新执行SSIS包。现在,每一次只有一个脚本任务执行。该顺序是不确定的,因此不可预测的。
停止调试,将MaxConcurrentExecutables设置回-1并保存SSIS包。
总结
在这篇文章中,我们在解决方案中添加了一个新的SSIS包,建立了我们的第一个脚本任务,它们之间通过一个成功优先约束连接。我们学习从SSIS脚本任务读取SSIS变量的值,以及MaxConcurrentExecutables属性。在下一篇,我们将看到更多SSIS优先约束的特点。

05-11 21:57