本篇文章是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. 半夜思考,为什么 String 具有不变性

    学习 Java 的数据类型时,特殊关照了 String 类型,具有不变性. 当时没有深入思考为什么 String 有不变性.而且我只碰到了 String 才有不变性.Java这样设计的缘由何在. 突然 ...

  2. codevs1839洞穴勘测

    题目链接:http://codevs.cn/problem/1839/ 题目描述 Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉 ...

  3. 【转】64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解

    64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解,开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛.  安装步骤 1.准备工具安装目录 下载 ar ...

  4. CF321E Ciel and Gondolas 【决策单调性dp】

    题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...

  5. Corosync+Pacemaker+crmsh构建Web高可用集群

    一.概述: 1.1 AIS和OpenAIS简介 AIS应用接口规范,是用来定义应用程序接口(API)的开放性规范的集合,这些应用程序作为中间件为应用服务提供一种开放.高移植性的程序接口.是在实现高可用 ...

  6. 【题解】CF1154

    A Description 有三个正整数 \(a,~b,~c\),现在给定 \(x_1~=~a + b,~x_2~=~a + c, x_3~=~b + c, ~x_4~=~a + b + c\),请求 ...

  7. 【DP/数学】【CF1061C】 Multiplicity

    Description 给定一个序列 \(a\),求有多少非空序列 \(b\) 满足 \(b\) 是 \(a\) 的子序列并且 \(\forall~k~\in~[1,len_b],~~k \mid b ...

  8. linux下tar.gz、tar、bz2、zip等解压缩、压缩命令

    转至:http://www.jb51.net/LINUXjishu/43356.html 说明:Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令 ...

  9. .net mvc 一个Action的 HttpGet 和 HttpPost

    http://www.cnblogs.com/freeliver54/p/3747836.html 本文转自:http://stackoverflow.com/questions/11767911/m ...

  10. 使用nginx的ngx_upstream_jdomain模块实现k8s容器的负载均衡

    使用背景最近一直在准备k8s上线事宜,目前已经在测试环境中全面部署并通过压力测试环境检验.离正式上线基本只剩下时间问题.我们目前测试环境中的容器负载均衡大量使用到了nginx,就是借助了ngx_ups ...