ssis常用包------foreach 循环容器
1. foreach 循环容器
接上面的例子:如果我们想把一组文件进行复制到指定目录并进行解压操作,该如何进行?那就需要用到foreach循环容器
Foreach 循环容器定义包中的重复控制流。循环的实现与编程语言中的 Foreach 循环结构类似。在包中,通过使用 Foreach 枚举器启用循环。Foreach 循环容器将重复指定枚举器的每个成员的控制流。
SQL ServerIntegration Services 提供了下列枚举器类型:
- Foreach ADO 枚举器,用于枚举表中的行。例如,可以获取 ADO 记录集中的行。
- Foreach ADO.NET 架构行集枚举器,用于枚举有关数据源的架构信息。例如,可枚举并获取一组 AdventureWorks2008R2SQL Server 数据库中的表。
- Foreach 文件枚举器,用于枚举文件夹中的文件。该枚举器可遍历子文件夹。例如,可读取 Windows 文件夹及其子文件夹中所有具有 *.log 文件扩展名的文件。
- Foreach 源变量枚举器,用于枚举指定变量包含的可枚举对象。可枚举对象可以是数组、ADO.NET DataTable 和 Integration Services 枚举器等。例如,可以枚举包含服务器名称的数组中的值。
- Foreach 项枚举器,用于枚举集合项。例如,可以枚举执行进程任务所使用的可执行文件和工作目录的名称。
- Foreach Nodelist 枚举器,用于枚举 XML Path 语言 (XPath) 表达式的结果集。例如,此表达式可枚举并获取古代的所有作者:/authors/author[@period='classical']。
- Foreach SMO 枚举器,用于枚举 SQL Server 管理对象 (SMO) 对象。例如,可枚举并获取 SQL Server 数据库中的视图列表。
1.1 枚举器类型
枚举器可以配置,您必须为不同的枚举器提供不同的信息。
下表汇总了每种枚举器类型需要的信息。
枚举器 |
配置要求 |
Foreach ADO |
指定 ADO 对象源变量和枚举器模式。 |
Foreach ADO.NET 架构行集 |
指定与数据库的连接和要枚举的架构。 |
Foreach 文件 |
指定要枚举的文件夹和文件、检索到的文件的文件名格式,以及是否要遍历子文件夹。 |
Foreach 源变量 |
指定包含要枚举的对象的变量。 |
Foreach 项 |
定义 Foreach 项集合中的项,包括列和列数据类型。 |
Foreach Nodelist |
指定 XML 文档的源并配置 XPath 操作。 |
Foreach SMO |
指定与数据库的连接以及要枚举的 SMO 对象。 |
1.2 配置枚举器
常规、集合、变量映射和表达式 ,具体情况请参阅technet相关信息。
http://technet.microsoft.com/zh-cn/library/ms187670(SQL.90).aspx 这里有非常详细的说明。
1.3 实例
首先拉入一个foreach循环容器,并配置如下
注意这里选取文件枚举器,虽然默认就是文件枚举器,但是需要先选择其他的Enumerator,然后切换回文件枚举器才能看到下面的设置,难道是我们sql2008的bug?
在变量映射的时候需要建立一个变量来存储文件的路径,如上图,类型为字符串
在连接管理器中,建立两个连接,分别指向到源地址和目标地址。这里需要注意的是。目标地址不需要指定具体的文件名,因为是多个,可以和上例一样先选中一个,然后再属性中再删除。源地址的connectstring要在连接后清除,因为我们需要使用我们新建立的变量filepath,在expressions中指定变量
看文件系统任务:
看执行进程任务
这里和上例都基本一致。
1.4 引申说明
这个例子把c:\ssis1\source下的所有文件copy到c:\ssis1\des下并解压压缩文件
在source下都是rar文件的时候运行正常。
如果source下除了rar文件还有其他文件,会怎样呢?那肯定会报错,因为在执行进程任务的时候,对非rar文件是无法进行解压操作的。那这个问题如何解决呢?
我们可以分成两部分处理,对rar执行上述操作,对非rar只执行copy操作。只要修改foreach的获取文件的类型把*.*修改为*.rar
工程下载:https://files.cnblogs.com/tippoint/%e9%a1%b9%e7%9b%ae1.rar