Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2562010
  • 博文数量: 245
  • 博客积分: 4125
  • 博客等级: 上校
  • 技术积分: 3113
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-25 23:56
文章分类

全部博文(245)

文章存档

2015年(2)

2014年(26)

2013年(41)

2012年(40)

2011年(134)

2010年(2)

分类: 数据库开发技术

2011-06-23 11:00:12

From:http://www.cnblogs.com/tylerdonet/archive/2011/04/08/2009890.html

容器

容器是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

现在来试验一个循环容器的用法,在这个例子中将试验在循环中五次执行一段脚本,这是一个很简单的例子,可以添加一些其他功能。

  1. 创建一个SSIS项目,将默认的package更名为ForLoop.dtsx
  2. 打开这个package,川建一个新的变量Counter,在面板中右击选择Variables,点击添加变量按钮,默认变量类型为int32
  3. 从工具箱中拖放一个Loop循环容器,双击打开编辑页面,设置InitExpression为@Counter = 0,循环开始时变量Counter的值设置为0,EvalExpression选项设置为@Counter < 5 and @Counter = @Counter + 1,在满足条件@Counter<5是循环一直执行,并自加1,在Name选项中输入Iterate through a Script,最后如图4-3
  4. 在这个Loop循环容器中拖放一个脚本任务,双击这个脚本任务,取名为Pop Up the Iteration
  5. 在脚本任务的编辑页面如图4-4,在ReadOnlyVariables选项中输入Counter,向任务传入一个参数变量
  6. 点击Design Script,打开Visual Studio编辑环境,在Mian()方法体内输入下面的代码,代码根据变量弹出对话框显示Counter变量的值
 
1 Public Sub Main()
2     Dim variables As Variables
3     If Dts.Variables.Contains("Counter") = True Then
4         Dts.VariableDispenser.LockOneForRead("Counter", variables)
5     End If
6     MsgBox("You are in iteration: " & CStr(variables("Counter").Value))
7     Dts.TaskResult = Dts.Results.Success
8 End Sub

注:VS2008环境内部分代码是Dts.TaskResult = ScriptResults.Success

  1. 退出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循环容器类似的例子,在这个例子中我们将列举一个文件夹下的所有文件,使用对话框输出文件的名字信息。

  1. 新建一个项目,将默认包重命名为ForeachLoop.dtsx
  2. 拖拽一个Foreach循环容器,双击打开编辑界面,在General标签内将它重命名为Iterate through Files
  3. 在Collection标签内,报纸Enumerator属性默认值Foreach File Enumerator,设置Folder属性内选择一个文件较少的文件夹,这个例子不会修改文件,只是读出文件的相关信息,在Files选项内保持默认值“.”,最后的界面如图4-5
  4. 转到变量映射标签页面内,在变量列内选择,打开添加变量对话框。为变量命名FileName,在Index列内变量的值默认0,因为只对一个文件夹下的文件循环操作,所以保持默认值0不变,点击OK退出编辑界面
  5. 拖放一个脚本任务放置到Foreach循环容器中,双击打开编辑界面重命名为Read Files
  6. 转到Script标签,在ReadOnlyVariale属性内设置变量FileName,点击Design打开Visual Studio编辑环境,使用下面代码代替Main()方法体内的代码
 
01  Public Sub Main()
02     Dim variables As Variables
03     If Dts.Variables.Contains("Counter") = True Then
04         Dts.VariableDispenser.LockOneForRead("Counter", variables)
05     End If
06     MsgBox("You are in iteration: " & CStr(variables("Counter").Value))
07     Dts.TaskResult = Dts.Results.Success
08 End Sub

注:VS2008环境内部分s代码是Dts.TaskResult = ScriptResults.Success

  7.  点击OK退出编辑界面,执行这个package得到的结果如图4-6(弹出内容根据具体设置不同而不同)

图4-6

图4-7

阅读(2259) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~