容器
容器是SSIS为一个或多个任务提供一种结构的对象。例如可以执行一个循环直到到达边界条件,或者将一系列的task按逻辑组织在一起。一个容器也可以包含其他的容器。容器和任务(task)一样也放在Control Flow标签内,总共有四种类型的容器:任务宿主Task Host,Sequence序列,For循环和Foreach循环。
任务宿主Task Host Containers
任务宿主是单个task的默认容器,你在工具栏中找不到这种工具的图标,实际上即使不选择一个容器,单个task仍然包含在一个任务宿主中。SSIS的结构通过任务宿主来扩展变量和事物控制。
Sequence容器
Sequence容器可以处理package中的子任务,将package划分成更容易控制的小片段。下面是Sequence容器的一些应用:
- 将task归类使其中一部分不再需要的task不能执行
- 缩小一个容器中的变量范围
- 设置容器中所有task的属性
- 使用方法来保证一个task执行成功之后再执行下一个task
在工具栏的Control Flow中拖放一个Sequence容器,如图4-1,左边是一个Sequence容器,包含两个task,右边是一个Foreach循环容器,左边容器中的task执行成功之后才能执行右边容器中的task。
图4-1
For循环容器
For循环容器像其他程序语言一样,是一种创建循环方法的任务。在这种循环中SSIS设置一个初始值,在循环中不断地重新赋值,只到不满足边界条件。
双击打开For循环容器的编辑页面如图4-2。InitExpression选择项设置循环的初始条件。EvalExpression选择项是每次循环都会重新赋值的,一旦它变成false,循环将停止。AssignExpression可以在每次循环时都改变表达式的值。
图4-2
现在来试验一个循环容器的用法,在这个例子中将试验在循环中五次执行一段脚本,这是一个很简单的例子,可以添加一些其他功能。
- 创建一个SSIS项目,将默认的package更名为ForLoop.dtsx
- 打开这个package,川建一个新的变量Counter,在面板中右击选择Variables,点击添加变量按钮,默认变量类型为int32
- 从工具箱中拖放一个Loop循环容器,双击打开编辑页面,设置InitExpression为@Counter = 0,循环开始时变量Counter的值设置为0,EvalExpression选项设置为@Counter < 5 and @Counter = @Counter + 1,在满足条件@Counter<5是循环一直执行,并自加1,在Name选项中输入Iterate through a Script,最后如图4-3
- 在这个Loop循环容器中拖放一个脚本任务,双击这个脚本任务,取名为Pop Up the Iteration
- 在脚本任务的编辑页面如图4-4,在ReadOnlyVariables选项中输入Counter,向任务传入一个参数变量
- 点击Design Script,打开Visual Studio编辑环境,在Mian()方法体内输入下面的代码,代码根据变量弹出对话框显示Counter变量的值
Public Sub Main() Dim variables As Variables If Dts.Variables.Contains("Counter") = True Then Dts.VariableDispenser.LockOneForRead("Counter", variables) End If MsgBox("You are in iteration: " & CStr(variables("Counter").Value)) Dts.TaskResult = Dts.Results.Success End Sub
注:VS2008环境内部分代码是Dts.TaskResult = ScriptResults.Success
- 退出Visual Studio编辑环境,回到原来的编辑界面,执行这个package结果如图4-5,会出现5个弹出框,从0到4,Task的颜色变成绿色,然后右变成黄色。最终执行完之循环后又变成绿色。
图4-3
图4-4
Foreach循环容器
Foreach循环容器是一个很强大的容器,它可以对对象集合进行循环操作。在循环操作的过程中取得对象集合中相关值,对象集合的类型可以是文件等,在下面列举。还可以将对象集合中的值映射到变量中。对象的类型根据标签Collection中Enumerator属性的设置不同,这些属性如下:
- For Each File Enumerator:对指定文件夹下的文件进行循环操作
- For Each Item Enumerator:对手动设置的对象集合进行循环操作
- For Each ADO Enumerator:对一个ADO集合中的表中的行进行循环操作
- For Each ADO.NET Schema Rowset Enumerator:对一个ADO.NET模型进行循环操作
- For Each From Variable Enumerator:对一组SSIS变量进行循环操作
- For Each Nodelist Enumerator:对一组XML节点对象进行循环操作
- For Each SMO Enumerator:对一组SQL管理对下你给进行循环操作
我们来做一个和For循环容器类似的例子,在这个例子中我们将列举一个文件夹下的所有文件,使用对话框输出文件的名字信息。
- 新建一个项目,将默认包重命名为ForeachLoop.dtsx
- 拖拽一个Foreach循环容器,双击打开编辑界面,在General标签内将它重命名为Iterate through Files
- 在Collection标签内,报纸Enumerator属性默认值Foreach File Enumerator,设置Folder属性内选择一个文件较少的文件夹,这个例子不会修改文件,只是读出文件的相关信息,在Files选项内保持默认值“.”,最后的界面如图4-5
- 转到变量映射标签页面内,在变量列内选择<New variable…>,打开添加变量对话框。为变量命名FileName,在Index列内变量的值默认0,因为只对一个文件夹下的文件循环操作,所以保持默认值0不变,点击OK退出编辑界面
- 拖放一个脚本任务放置到Foreach循环容器中,双击打开编辑界面重命名为Read Files
- 转到Script标签,在ReadOnlyVariale属性内设置变量FileName,点击Design打开Visual Studio编辑环境,使用下面代码代替Main()方法体内的代码
Public Sub Main() Dim variables As Variables If Dts.Variables.Contains("Counter") = True Then Dts.VariableDispenser.LockOneForRead("Counter", variables) End If MsgBox("You are in iteration: " & CStr(variables("Counter").Value)) Dts.TaskResult = Dts.Results.Success End Sub
注:VS2008环境内部分s代码是Dts.TaskResult = ScriptResults.Success
7. 点击OK退出编辑界面,执行这个package得到的结果如图4-6(弹出内容根据具体设置不同而不同)
图4-6
图4-7
作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com 联系我,非常感谢。