在第 1 课:创建简单 ETL 包中,创建了从单个平面文件源提取数据的包,然后使用查找转换功能对数据进行了转换,最后将数据加载到 AdventureWorksDW 示例数据库的 FactCurrency 事实数据表中。
但是,提取、转换和加载 (ETL) 过程很少使用单个平面文件。典型的 ETL 过程从多个平面文件源提取数据。从多个源提取数据需要采用迭代控制流。Microsoft SQL Server 2005 Integration Services (SSIS) 的一项最有可能出现的功能是您将很容易向包中添加迭代或循环。
Integration Services 为循环遍历包提供了两种容器类型:Foreach 循环容器和 For 循环容器。Foreach 循环容器使用枚举器执行循环,而 For 循环则通常使用变量表达式。本课使用 Foreach 循环容器。
Foreach 循环容器使包能够对指定枚举器的每个成员重复执行控制流。使用 Foreach 循环容器,可以枚举:
- ADO 记录集行和架构信息
- 文件和目录结构
- 系统、包和用户变量
- SQL 管理对象 (SMO)
在本课中,您将修改在第 1 课中创建的简单 ETL 包,以便利用 Foreach 循环容器。还将设置用户定义的包变量,以便使该教程包能够迭代遍历文件夹中的所有平面文件。
此任务中,将创建 SSIS Tutorial 项目中包含的 Lesson 1.dtsx 包的副本。您将使用这一新副本来完成第 2 课剩余部分。
创建 Lesson 2 包
如果 Business Intelligence Development Studio 尚未打开,请单击“开始”,指向“所有程序”,指向 Microsoft SQL Server 2005,再单击 Business Intelligence Development Studio。
在“文件”菜单上,依次单击“打开”、“项目/解决方案”、SSIS Tutorial 文件夹,然后再次单击“打开”,最后双击 SSIS Tutorial.sln。
在解决方案资源管理器中,右键单击 Lesson 1.dtsx,再单击“复制”。
在解决方案资源管理器中,右键单击“SSIS 包”,再单击“粘贴”。
默认情况下,复制的包将命名为 Lesson 2.dtsx。
在解决方案资源管理器中,双击 Lesson 2.dtsx 打开该包。
在本任务中,您将添加循环访问平面文件的文件夹的功能,并将第 1 课中使用的同一数据流转换应用于其中的每个平面文件。实现方法是将 Foreach 循环容器添加到控制流中并进行配置。
所添加的 Foreach 循环容器必须能够连接到该文件夹中的每个平面文件。由于该文件夹中的所有文件都具有相同格式,因此 Foreach 循环容器可以使用同一平面文件连接管理器来连接其中的每个文件。该容器所使用的平面文件连接管理器与您在第 1 课中创建的平面文件连接管理器相同。
目前,第 1 课中的平面文件连接管理器只连接一个特定的平面文件。若要循环地连接该文件夹中的每个平面文件,必须同时对 Foreach 循环容器和平面文件连接管理器进行如下配置:
- Foreach 循环容器 将该容器的枚举值映射为用户定义的包变量。然后,该容器将使用此用户定义变量来动态修改平面文件连接管理器的 ConnectionString 属性,并循环连接该文件夹中的每个平面文件。
- 平面文件连接管理器 使用用户定义的变量填充在第 1 课中创建的连接管理器的 ConnectionString 属性,以修改该连接管理器。
本任务中的过程向您显示如何创建和修改 Foreach 循环容器以使用用户定义的包变量,以及如何将数据流任务添加到该循环中。您将学习如何修改平面文件连接管理器,以便在下一任务中使用用户定义的变量。
在对该包进行这些修改后,当该包运行时,Foreach 循环容器将循环访问示例数据文件夹中的文件集合。每次找到一个与条件相匹配的文件时,Foreach 循环容器就会将用该文件名填充用户定义的变量,将用户定义的变量映射到 SampleCurrencyData 平面文件连接管理器的 ConnectionString 属性,然后对该文件运行数据流。因此,在 Foreach 循环的每次迭代中,数据流任务都将使用一个不同的平面文件。
注意: |
---|
由于 Microsoft SQL Server 2005 Integration Services (SSIS) 区分控制流和数据流,因此添加到控制流的任何循环都不需要对数据流进行修改。因此,无需更改在第 1 课中创建的数据流。 |
添加 Foreach 循环容器
在 Business Intelligence Development Studio 中,单击“控制流”选项卡。
在“工具箱”中,展开“控制流项”,然后将“Foreach 循环容器”拖到“控制流”选项卡的设计图面上。
右键单击新添加的“Foreach 循环容器”,并选择“编辑”。
在“Foreach 循环编辑器”对话框的“常规”页上,为“名称”输入 Foreach File in Folder。
为 Foreach 循环容器配置枚举器
单击“集合”。
在“集合”页上,选择“Foreach 文件枚举器”。
在“枚举器配置”组中,单击“浏览”。
在“浏览文件夹”对话框中,找到包含教程示例数据的示例数据文件夹。
默认情况下,教程示例数据安装在 c:\Program Files\Microsoft SQL Server\90\Samples\Integration Services\Tutorial\Creating a Simple ETL Package\Sample Data 文件夹中。
在“文件”框中,键入 Currency_*.txt。
将枚举器映射为用户定义的变量
单击“变量映射”。
在“变量映射”页的“变量”列中,单击空单元格并选择“<新建变量…>”。
在“添加变量”对话框中,为“名称”键入 varFileName。
单击“确定”。
再次单击“确定”,退出“Foreach 循环编辑器”对话框。
将数据流任务添加到循环中
将“提取示例货币”数据流任务拖到现已重命名为 Foreach File in Folder 的 Foreach 循环容器中。
在本任务中,您将修改在第 1 课中创建和配置的平面文件连接管理器。平面文件连接管理器在最初创建时配置为静态加载单个文件。若要启用平面文件连接管理器以重复加载文件,您必须修改连接管理器的 ConnectionString 属性以接受用户定义的变量 User:varFileName
,该变量包含要在运行时加载的文件的路径。
通过将连接管理器修改为使用用户定义的变量 User::varFileName
的值并填充连接管理器的 ConnectionString 属性,连接管理器将能够连接到不同的平面文件。在运行时,Foreach 循环容器的每次迭代都将动态更新 User::varFileName
变量。更新变量时,还会使连接管理器连接到不同的平面文件,并使数据流任务处理其他数据集。
配置平面文件连接管理器以使用连接字符串的变量
在“连接管理器”窗格中,单击 SampleCurrencyData。
在“属性”窗口中,针对“表达式”,单击空单元,然后单击省略号按钮“(…)”。
在“属性表达式编辑器”对话框的“属性”列中,键入或选择 ConnectionString。
在“表达式”列中,单击省略号按钮“(…)”以打开“表达式生成器”对话框。
在“表达式生成器”对话框中,展开“变量”节点。
将变量 User::varFileName 拖到“表达式”框中。
单击“确定”关闭“表达式生成器”对话框。
再次单击“确定”关闭“属性表达式编辑器”对话框。
在“调试”菜单上,单击“启动调试”。
包将运行。可以在“输出”窗口中或单击“进度”选项卡来验证每个循环的状态。例如,可以看到 1097 行从文件 Currency_VEB.txt 添加到目标表中。
当包运行完毕后,在“调试”菜单上,单击“停止调试”。
使用以下过程可以测试已添加到包中的新循环功能。