Foreach Loop 容器是SSIS 结构化控制流设计中一个非常常用的控制流任务,它用来遍历一个集合中的所有对象,然后执行相同的操作,它的功能类似于结构化程序设计中的
Foreach i in 集合
…
END 结构,在SSIS中这些可以定义的集合包括:
项目集合 (Foreach Item Enumberator)
文件集合(Foreach File Enumberator)
记录集合 (Foreach ADO Enumberator)
表结构集合 (Foreach ADO.NET Schema Enumberator)
变量值集合 (Foreach From Variable Enumberator)
XML 节点集合 (Foreach Nodelist Enumberator)
SQL Server Management Object 集合 (Foreach SMO Enumberator)
Foreach Item Enumberator 一个最常见的使用是遍历服务器中的数据库,然后对数据库中的表执行相同的操作。比如说我有10 个不同的数据库,分布在不同的数据库服务器上,现在我们需要对10个数据库中的一个表进行一个相似的操作:清除一个叫做 Log 的表的内容。当然有很多方法实现这个目的,但是在我的这个例子中我使用 Foreach Loop 容器来实现它。
- 首先建立一个新的SSIS Package
- 建立两个系统变量:DatabaseName 和 ServerName,这两个变量将用来存储 Foreach Loop 中的Item 集合中表示的服务器名和数据库名
- 建立一个OLEDB 的数据连接,使用Windows Authentication,并且要确保SSIS Package 的执行用户在每个数据库上都有执行相适应的DML 的权限;使用表达式的方式动态生成连接字符串。(参考我的另一篇文章: http://www.bridata.ca/blog/?p=216 如何使用数据库动态连接)
- 将一个Foreach Loop Container 放在Control Flow 页面中,双击打开编辑器;
- 在 Collection 面板中的Enumerator 下选择 Foreach Item Enumberator;
- 这时候的窗口的下方就会出现 Enumertor Configuration 区域,单击 Columns 按钮,添加两个Items 中的字段,它们的数据类型全部是 String 类型,这两个字段分别用来存储 服务器名称和数据库名称;注意:字段的名称不能修改,系统默认是 Column 0, column 1….
- 在 Column 0 和 Column 1 中分别输入服务器名和数据库名, 如下图所示:
- 单击屏幕上的 Collection, 选择变量映射, 如下图所示, 用户变量ServerName 和 DatabaseName 的索引分别是 0 和1, 也就是说和上图中的 Column0 和 Column1 是映射关系,他们用来存储 Foreach Loop 中的Item 集合中的值。比如说这本例中 Item 集合中有10 行数据,也就是在运行中有10 次循环,每一次循环,我们的用户变量 ServerName 和 DatabaseName 的值都会根据 Item 集合中的值被改变。
- 将一个 Execute SQL Task 加入到Foreach Loop 容器中,设置其 ConnectionType 为 OLE DB, Connection 为刚建立的 OLEDB Connection,在 SQL statement 中输入:Truncate Table Log。部分SSIS Package 如下图所示:
因为这个OLEDB连接 是基于变量建立的,而变量在Foreach Item 的循环中动态改变,所以这个连接也就动态改变。
时间: 2024-10-19 12:16:22