模糊分组转换执行数据清理工作。它首先查找可能重复的行,然后选择要在对数据进行标准化的过程使用的规范数据行。模糊分组的任务编辑器有下面三个标签:
1. 连接管理器
使用列表框选择现有的 OLE DB 连接管理器,或使用“新建”按钮创建新的连接。

该功能主要是为模糊分组转换算法完成工作所需而需要创建临时 SQL Server 表。创建的表可能会很大,因此在生产服务其只有有限的可用磁盘空间时,因该考虑将模糊分组转换连接到Sql Server 的非生产实例中。则此转换性能可能会提高。
2 列
该选项卡可以设置 用于对带有重复值的行进行分组。如图:

若要配置该转换,您必须选择要在确定重复项时使用的输入列,而且必须为每列选择匹配类型(模糊匹配或完全匹配)。完全匹配保证只对该列中具有相同值的行进行分组。完全匹配可以应用到除 DT_TEXT、DT_NTEXT 和 DT_IMAGE 之外的任何 Integration Services 数据类型的列。模糊匹配对具有相似值的行进行分组。近似匹配数据的方法基于用户指定的相似性得分。在模糊匹配中,只能使用具有 DT_WSTR 和 DT_STR 数据类型的列。
在图中最下面每列表示的含义如下:
|
列名 |
说明 |
|
输入列 |
在可用输入列中选择要分组的输入列 |
|
输出别名 |
为相应的输出列输入一个描述性的名称,默认为输入列名 |
|
组输出别名 |
为包含分组重复项的规范值得列输入一个描述性名称。默认为输入列名后加_clean |
|
匹配类型 |
两种,Fuzzy-模糊匹配,Extract-完全匹配 |
|
最低相似性 |
设置相似性阈值。改值越接近1,查找值与源值重复可能性越高 |
|
相似性输出别名 |
为包含所选联接相似性得分的新输出列指定名称.如果将该值保留空,将不会创建输出列. |
|
数字 |
指定比较列数据时前导数字和尾随数字的重要性.Neither-前导数字和尾随数字都不重要。Leading-只有前导数字重要。Trailing-只有尾随数字重要。LeadingAndTrailing-前导和尾随数字都重要 |
|
比较标志 |
包含忽略大小写、忽略假名类型、忽略符号、忽略字符宽度等等。 |
3 高级选项卡
在高级选项卡中可以指定输入列和输出列、设置相似性阈值和定义分隔符。见下图

了解这些信息后,我们现在就已例子来介绍如何使用模糊分组转换功能。假设人事部在输入每个员工的时候会有一些笔误。这里我们使用模糊分组来得到最标准的职位名称和每个员工的职位和这个标准的名称的相似度。
1.在E:\BI资料\IntegrationServices文件下创建一个名为“EmployData”的文档。文档内容如下:

2.创建一个名为”FuzzyGroupDemo”的包,在控制流界面拖放一个DataFlow任务。然后在联接管理器界面创建一个名为“EmployData”的平面文件联接器,连接上面创建的txt文件。
3.在常规选项卡中设置格式属性为右边未对齐(Ragged Right),代码页属性设置为1252(ANSI-拉丁语I)。其他设置参考如下图:

4. 在列选项卡中点击列边界分别在第5个字符和第28个字符处点击放置两个分割线如图。

5. 点击高级标签设置TITLE的OutputColumnWidth为50,保存连接。

6. 在数据流选项卡中拖放一个平面文件数据源。平面文件连接器属性设置为EmployData。
7. 拖放一个模糊分组转换任务。并将于平面文件源连接,箭头指向模糊转换任务。
8. 在模糊分组转换任务中的连接管理器属性中单击新建按钮。创建一个OLE DB连接管理器。用于连接AdventureWorks数据库。
9. 在列属性中,选择Title列做为输入列,其他默认输入。如图:

10. 在高级选项中,相似性阈值设置为0.5,其他都是默认.
11. 拖放一个OLE DB目标源,设置OLE DB连接管理器为刚才创建的数据库连接器。数据访问模式设置为表或试图-快速加载、单击新建,弹出对话框

对框中的sql脚本做如下设置:
CREATE TABLE [FuzzyGroup] (
[key_in] int primary key,
[key_out] int,
[score] real,
[EMPID] varchar(5),
[TITLE] varchar(50),
[LNAME] varchar(50),
[TITLE _clean] varchar(50),
[_Similarity_TITLE] real
)
然后单击确定。
12. 单击映射选项卡。做如下设置。

13执行包。成功后如下图:

13. 查看结果,在AdventrureWorks数据库中的表FuzzyGroup中查看结果如下:

OK,模糊分组转换功能介绍完毕。
一 导出转换组件
导出列转换读取数据流中的数据,并将数据插入到指定的文件中.次转换使用成对的数入列:一列是要输出的数据,一列是将这些数据输出到哪些文件里.转换在处理时,数据将插入到指定的文件中.如果这些文件不存在,转换将创建这些文件,然后将数据写入到文件中.要写入的数据必须具有DT_Text、DT_NTEXT或DT_IMAGE数据类型。
下面的例子中将介绍如何使用该转换工具。本例演示如何将数据库AdVentureWorks中Production.Document表中的Document列导出到文件中。
- 创建一个文件夹E:\SSIS\SSISDemo\Export,导入的文件将放在这个文件夹中。
- 新建一个名为ExportColumnDemo的包,在控制流中添加一个Data Flow Task。然后在连接管理器中创建一个OLEDB连接,用于连接AdventureWorks数据库。如图:

- 打开数据流界面,添加一个OLE DB,连接到LocalHost.AdventureWorks中的production.document表。预览这个表可以看到有一个列FileName,他们指定了文件的存储路径。在导出数据时,我们可以把Document列数据导出到E:\SSIS\SSISDemo\Export

- 添加一个派生列转换将与刚创建的数据源连接起来。前头指向派生列。编辑派生列。按如图黄色标记设置:

- 添加一个到出列转换,将派生列与它连接起来。然后双击导出列, 弹出的窗口。在提取列中选择Document列,应为在表[Production].[document]中这一列是文件列,在文件路径列中选择NewPath,因为这一列是通过派生列产生的文件路径。

下面详细了解一下窗口中的允许追加、强制截取以及编写字节顺序列的含义:
|
列名 |
说明 |
|
允许追加 |
指定转换是否将数据追加到现有文件中。默认false |
|
强制截取 |
指定转换在写入数据之前是否删除现有文件的内容。默认值为false |
|
编写字节顺序 |
指定是否将字节数序标记(BOM)写入文件。只有在数据具有DT_TEXT或DT_NTEXT数据类型,并且未将数据追加到现有数据文件时,才会写入标记(BOM) |
- 执行包,如图1-1,可以看到文件夹中已经有9个文件。见图:1-2

图1-1

图1-2
- 当我们重新设置导出列的属性时,按如下图设置:

然后执行该包,结果会报错如图:

在 执行结果中看到如下错误信息
[Export Column [37]] 错误: 无法打开要执行写操作的文件“E:\SSIS\SSISDemo\Export\Crank Arm and Tire Maintenance.doc”。该文件存在且不能被覆盖。如果 AllowAppend 属性为 FALSE,并且 ForceTruncate 属性被设置为 FALSE,则存在该文件将会导致此失败。如何避免这些错误可以参考以下内容:
|
追加 |
截断 |
文件存在 |
结果 |
|
False |
False |
否 |
该转换将创建一个新文件并将数据写入到该文件中。 |
|
True |
False |
否 |
该转换将创建一个新文件并将数据写入到该文件中。 |
|
False |
True |
否 |
该转换将创建一个新文件并将数据写入到该文件中。 |
|
True |
True |
否 |
该转换的设计时验证失败。将两个属性都设置为 true 是无效的。 |
|
False |
False |
是 |
发生运行时错误。文件存在,但转换无法写入到文件中。 |
|
False |
True |
是 |
转换将删除文件,然后重新创建文件并将数据写入到文件中。 |
|
True |
False |
是 |
转换将打开文件并将数据写入到文件末尾。 |
|
True |
True |
是 |
该转换的设计时验证失败。将两个属性都设置为 true 是无效的。 |
二 导入列转换
导入列转换与导出列转换正好相反,它是从文本中读取数据并将数据添加到数据流中的列中.通过此转换,包可以将存储于各个单独文件中的文本和图像添加到数据流中.使用导入列转换要求输入列得数据类型必须是DT_TEXT、DT_NTEXT或DT_IMAGE.
现在来做一个例子介绍一下如何将图像文件导入到AdventureWorks数据库中。
- 创建路径E:\BI资料\IntegrationServices\ImportColumn,然后在该文件中任意创建5个图片。在在该文件中创建一个名为“PictureInfo”的txt文本。其内容如下:
E:\BI资料\IntegrationServices\ImportColumn\1.png
E:\BI资料\IntegrationServices\ImportColumn\2.png
E:\BI资料\IntegrationServices\ImportColumn\3.png
E:\BI资料\IntegrationServices\ImportColumn\4.png
E:\BI资料\IntegrationServices\ImportColumn\5.png
自此整个文件的内容如下:

2.在AdventureWorks数据库中执行下面的sql语句
CREATE TABLE [dbo].[MyImages](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ImageFilePath] [varchar](100) NOT NULL,
[Document] [image] NOT NULL,
[CreateTime] [datetime] NOT NULL,
CONSTRAINT [PK__tblmyIma__3214EC272D47B39A] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
3.新建一个名为“ImportColum”的包,在控制流中拖放一个“Data Flow Task”,然后再连接管理器中创建一个OLE DB 连接用于连接AdventureWorks数据库。如图:

4 在数据流选项卡中,拖放一个平面文件数据源。命名为“Image Source”,然后右键单击编辑,弹出窗口,然后再窗口中,单击新建按钮。数据源设置为: E:\BI资料\IntegrationServices\ImportColumn\PictureInfo.txt。在常规和高级选项中设置如下:


设置成功后,可以单击预览,看一下设置结果:

- 设置好平面数据源后,托动一个导入列转换到数据流选项卡中,命名为“Improt Column”,并将与平面数据源连接。绿色箭头指向导入列转换工具。双击导入列转换弹出窗口,在输入列选项卡中选中可用输入列。如下图:

- 在刚才的弹出框中选择输入属性和输出属性选项卡,你会发现输入列集合中有一列ImageFilePath,但是在输出列集合中却没有列输出。此时我们加入一个输入列名为”Document”,类型为DT_IMAGE.如图:注意红色标记的地方

在下方我们看到一行警告信息。解决此警告信息我们做如下操作。选中框中的名为ImageFilePath的输入列。将FileDataColumnID属性设置为输出列Document的ID即可。如下图红色标注的地方。

设置成功。警告信息消失。此时导入列转换配置成功。
- 托动一个派生列到数据流中与导入列转换相连。箭头指向派生列。设置派生列

- 最后添加OLE DB Desination,将Import Column和Ole DB Destination连接起来,编辑Ole DB Destination设置为如上创建的表(MyImages),点击Mappings setting设置列映射

- 设置成功后执行该包:

查看目标数据库中的MyImages表。如下:
导出、导入组件功能我们学习完毕。谢谢!
一 复制转换
复制列转换是一种很简单的转换机制。它主要是将一列或多列地数据复制一份。然后后续的工作可以对复制的列中的数据做任何操作。而不影响被复制列的数据。下面我们接着上一篇的条件性拆分的包来介绍如何使用复制转换。
将复制列转换从工具箱中 托动到数据流选项卡中。并于ExcelSaleOrderCout行计数连接。连接方向是行计数指向复制列转换。双击打开复制列,弹出编辑界面,选择要拷贝的列,并可以重命名。结果如下图:

到此复制列转换工具配置完成,接下来你可以从工具箱中拖动任何控件与之连接。使用复制的列。
二 数据转换(Data Conversion)
数据转换也是一个比较简单的转换组件,它是将输入列的类型转换为其他类型并作为新的列输出。可以对单个输入列应用多个转换。下面让我们一起了解如何使用该功能。
1.打开Intergration Service项目,创建名为”DataConversionDemo”的包。并在控制流中拖放一个数据流任务组件。如图:

2.在连接管理器中新建一个OLE DB连接,连接数据库AdventureWorks.创建成功后结果如下图:

3.在数据流选项卡中托动一个OLE DB源和一个数据转换任务。并将连接线(绿色或红色箭头)从源或前一转换拖动到数据转换,从而将数据转换连接到数据流。
4.双击数据转换,弹出窗口。选择需要转换的列,在DataType下拉列表中选择需要的数据类型。Output Alias栏内设置输出时使用的别名。

5.单击确定按钮,数据转换功能配置完成。
三 行计数
行计数转换在行通过数据流时对行进行计数,并将最终计数结果存储在一个变量中。在使用行计数控件之前我们需要创建一个自定义变量。
1.在菜单栏中单击“SSIS(S)”选项,然后在其下拉框中选中“变量”选项。弹出如下窗口:

2.单击添加变量按钮,如图中带有红色圆圈的按钮。此时在会增加一个变量如图:

将名称中的“变量”改为:" Count".到此用户自定义变量增加完成。如果想删除用户自定义的变量,则选中要删除的变量,然后单击图中带有红色“X”的按钮即可。
3.拖放一个行计数转换到 “DataConversionDemo”包中,并与数据转换连结,箭头指向行计数。右键单击行计数,然后选择“编辑”选项,在弹出的窗口中将VariableName设置为User::Count。单击确定按钮,行计数配置完毕。
如果想在执行包的过程中想查看一下利用数据转换后的数据。我们需配置一个数据查看器。
右键单击 数据转换和行计数转换中的连接,选择”数据查看器“,弹出如下对话框:

然后选择“数据查看器”,在右边单击添加按钮,弹出如下图框:

在“常规”选项卡中,选中“网格”,单击确定按钮。OK,数据查看器配置完成,整个包的配置如下:

到此,我们学会如何使用复制转换、数据转换、行计数三种转换功能,同时在本文中也介绍了如何添加用户自定义变量以及数据查看器。
一 派生列
派生列转换通过对输入列进行类型转换或应用表达式得出新的结果。这个结果可以作为新列添加,也可以替换输入列。可以使用此转换执行下列任务:
1.将不同列的数据连接到一个派生列中。例如,可以使用表达式 FirstName + " " + LastName 将 FirstName 和 LastName 列中的值组合到名为 FullName 的单个派 生列中。
2.通过使用 SUBSTRING 之类的函数从字符串数据中提取字符,然后将结果存储到派生列中。例如,可以使用表达式 SUBSTRING(FirstName,1,1) 从 FirstName 列提取人名的首字母。
3.对数值数据应用数学函数,然后将结果存储到派生列中。例如,可以使用表达式 ROUND(SalesTax, 2) 将数值列 SalesTax 的值更改为精确到小数点后两位。
4.创建比较输入列和变量的表达式。例如,可以使用表达式 ProductVersion == @Version? ProductVersion : @Version 来比较变量 Version 与 ProductVersion列中的数据,然后根据比较结果决定选用 Version 还是 ProductVersion 的值。
5.提取日期时间值的某部分。例如,可以通过表达式 DATEPART("year",GETDATE()) 使用 GETDATE 和 DATEPART 函数提取当前年份。
在上篇聚合转换文章中我们已经使用到了派生列。其配置如下:
在这图中,可以根据需求来进行一些设计。本图的设置为计算单个商品购买的总金额。
二 审核转换
审核转换控件配置很简单,它使得包中的数据流包含有关包运行所处环境的数据。例如可以将包的名称、计算机名称和操作员姓名添加到数据流中。该转换功能只以下系统变量。
|
值 |
说明 |
|
执行实例 GUID |
插入唯一标识包的执行实例的 GUID。 |
|
包 ID |
插入唯一标识包的 GUID。 |
|
包名称 |
插入包名称。 |
|
版本 ID |
插入唯一标识包版本的 GUID。 |
|
执行开始时间 |
插入包执行的开始时间。 |
|
计算机名称 |
插入启动包的计算机的名称。 |
|
用户名 |
插入启动包的用户的登录名。 |
|
任务名称 |
插入与审核转换相关联的数据流任务的名称。 |
|
任务 ID |
插入唯一标识与审核转换相关联的数据流任务的 GUID。 |
配置该转换功能如下步骤。
- 将审核转换控件按拖放到数据流任务中,并将上游的控件用绿色箭头连接起来。如图:

- 右键单击审核转换弹出窗口

- 单击审核类型下拉框。选中需要的系统变量。然后在输出列中设置输出的名称。得到如下结果:

配置好审核的系统变量,单击确定即可完成审核转换功能的配置信息。整个流程如下:

将转换的数据存放到C:\Users\zhuyujing\Desktop\test.txt。执行包.得到的结果如下:

三 字符映射表转换
字符映射表转换其实就是将字符串函数应用于输入列中的字符数据。该功能只对字符串数据类型的输入列执行。例如我们可以将字符转换为下写、大写、或则繁体等等。如下图所示
现在我们就演示一下将输入列中的NewName、PackageName分别转换为繁体和大写的,并将输入列NewName用转换后的繁体替换,创建一个新的列NewPackageName用于存储输入列PackageName映射的繁体字符。整个流程如下:

配置成功后执行包。可以看到没有转换之前,NewName和PageageName分别是简体和小写字符

转换后,NewName列中的数据变成繁体、packageName列对应的NewPackageName列都是大写字符。
四 条件性拆分转换
条件性拆分转换功能类似 C#编程语言中的swith…case 语句。此转换将计算表达式,并且根据计算的结果将数据行定向到不同输出中。此转换还提供一个默认输出,如何某个行与任何表达式都不匹配。则它将被定向到默认输出。例如,可以将销售订单总额在1000~3000之间的数据输出到一个路径,将销售订单总额在3000~7000之间的数据输入到一个路径,将销售订单总额>=7000的数据输出到一个路径。不满足以上条件的设置为默认条件。作为另外一条路径输出。在设置这些条件的同时还可以编辑输出列的名称。最终结果如下图:

配置好以后单击确定即可。为了检测结果。我们先在变量选项卡中设置如下几个变量

然后在数据流选项开中托动四个行计数转并修改名称。如图:

右键单击其中一个行计数,弹出窗口后,按如下图设置VariableName属性。本图已名为BadRowCount为例。其他行计数转换分别按同样的操作设置VariableName即可。

然后将刚才的条件性拆分转换与其中一个行计数用绿色箭头连接。弹出如下窗口
在输出下拉框中选中条件。然后单击确定按钮即可。如下图

其他三个行计数转换按此步骤操作即可。最总得到如下图:

执行该包,等到如下图所示的结果

聚合转换功能类似于sql语句中的聚合函数。它应用列值,并将结果作为新列复制到转换输出中。聚合转换支持下列运算功能
|
运算 |
说明 |
|
Group by |
将数据集划分为组。任何数据类型的列都可用于分组。 |
|
Sum |
对列中的值求和。只能对数值数据类型的列求和。 |
|
Average |
返回列中值的平均值。只能对数值数据类型的列求平均值。 |
|
Count |
返回组中项目的数量。 |
|
Count distinct |
返回组中的唯一非空值的数量。 |
|
Minimum |
返回组中的最小值。 |
|
Maximum |
返回组中的最大值。 |
添加并配置聚合转换,则包必须已含有至少一个数据流任务和一个数据源。这里已一个简单的例子来介绍一下如何配置聚合转换。本例子的内容为:聚合每个订单的总金额。如果用T-SQL的话也就一个语句就可以了:
select SalesOrderID,SUM(OrderQty*UnitPrice) amount from Sales.SalesOrderDetail
现在介绍通过聚合转换如何获取同样的结果。
- 在BIDS中,打开包含所需包的Integration Services 项目。
- 在解决方案资源管理器中的SSIS包文件创建一个名为AggrationDemo的包,可以看到如下结果

- 在AggregationDemo包控制流选项卡中拖放一个数据流任务,如图

- 在连接管理器中窗口中,创建一个OLEDB连接器连接本地数据库AdventureWorks、一个平面文件连接器连接C:\Users\zhuyujing\Desktop\test.txt。如图:

- 在数据流选项卡中,托动一个OLE DB源、派生列、聚合转换以及目标平面文件。如图:

各个控件配置如下:
- OLE DB源

- 派生列

- 聚合转换

其中在比较标志列表中有四个复选框。表示的含义如下:
|
比较选项 |
说明 |
|
忽略大小写 |
指定比较是否区分大小写字母。如果设置了此选项,字符串比较会忽略大小写。例如,"ABC" 和 "abc" 没有区别。 |
|
忽略假名类型 |
指定比较是否区分日语的两种假名字符类型:平假名和片假名。如果设置了此选项,字符串比较会忽略假名类型。 |
|
忽略字符宽度 |
指定比较是否区分字符的单字节形式和该字符的双字节形式。如果设置了此选项,字符串比较将把同一字符的单字节形式和双字节形式视为相同。 |
|
忽略非空格字符 |
指定比较是否区分空格字符和标注字符。如果设置了此选项,则比较会忽略标注字符。例如,"å" 与 "a" 相同。 |
- 目标平面文件

配置好控件阿任务后,执行该包。执行结果如下:

打开目标txt文本,看看执行的结果

数据流任务主要用于运行数据流以提取、转换、加载源数据。一个包中可以有多个数据流任务,也可以包含零个数据流任务。下面关系图显示含有一个数据流任务的包:

了解数据流任务后,我们就简要的学习一下如何创建数据流任务。
- 在工具箱中双击数据流任务控件或则将其拖放到控制流页面中。如图:

你可以根据需求来修改数据流任务的属性。
2. 单击数据流选项卡,从工具箱中拖放一个OLE DB Source.命名为Products。右击选择编辑进行配置。如图所示。
其中sql语句的问号表示通过变量传递的参数值。单击参数按钮将问号映射到创建的变量。如图:
你也可以通过变量属性的下拉框中选择新建变量选项创建新的变量。然后单击确定按钮回到父选项框,再然后单击确定按钮
3. 在工具箱将Lookup 查找控件拖放到数据流中,通过从数据源拖动绿色箭头到该转换,将Products源和Lookup转换相连接。将Lookup转换命名为Find Model name。然后双击该控件,做如下配置:
3.1 常规选项卡配置如下:

3.2 连接配置如下

3.3 列配置如下

3.4 高级配置如下
如果在常规选项卡中选择完全缓存模式,则该选项卡不能使用。

3.5 错误输出配置如下

这样一个完整的Lookup转换就配置结束。这个已完成的配置的转换现在的做法是,试图根据数据源中的ProductModelID匹配表ProductModel。如果无匹配的行,就会发生错误,不过,因为已经配置该转换忽略这一错误,因此如果没有找到匹配的。ModelName列将包含Null值。
4. 将一个派生列和行计数控件拖放到数据流中,分别命名为 Assign Default Values And Prie、No Mapping Count,并将Lookup转换的输出连接到该派生列行计数控件。如下图:

打开派生列的编辑框。配置如下信息

配置行计数信息如下

5.经过对源数据的转换后,将这些数据加载到目标数据中。可以将行计数拖放到设计窗格。连接派生列到行计数,将行计数命名为Mapping Count。双击它并配置如下信息:

将组建选项卡中的VariableName属性设为IntCount,当然这个变量事先要在变量工具箱中设计好。
- 在工具箱中的数据流目标卡中,托动一个平面文件目标。命名为Partner Extract。右击单击编辑,选择新建按钮,弹出对话框

然后单击确定按钮,弹出下面的对话框

剩下的配置,按连接管理器配置方式进行配置。在这我们是将转换后的数据输出到:
E:\BI资料\SSISETLDemo\partnerextract.txt 中
到此一个完整的数据流任务就建立完成。整体流程如下

运行该包。得到如下信息

序列容器是一种十分简单,但使用非常广泛的容器,它可以对控制流的任务流组件进行结构化处理,把一些业务相关的任务组件,放到一个序列容器中,使整个包看起来更加整洁、美观,就如同我们家里的书柜、衣柜似的,把不同种类的东西整理在里面,收藏起来,既美观,又易于取用。
比如,在一个Integration Sevices包中,包含有财务数据、业务数据。整个包中的任务组件会非常多,如果不对它们进行分组管理,整个包看起来就会比较乱,非常难于管理与维护。相反如果我们将处理财务数据的任务,放入一个序列容器中,将处理业务数据的任务放入另一个序列容器,整个包看起来,就会一目了然,哪些任务是处理财务数据,哪些任务是处理业务数据了,非常清楚。如图:

不仅如此,如果点击右上角象箭头一样的符号,还可才把这些容器折叠起来,整个包就更加清楚明了,一目了然了。如图:

上一篇介绍了For循环容器的使用。本篇将介绍Foreach循环容器和序列容器的使用。
Foreach循环容器
Foreach循环容器定义包中的控制流。其循环的实现类似于编程语言中的Foreach循环结构。SQL Service Integration Services为Foreach容器提供了一下几种枚举类型
|
枚举器 |
配置要求 |
|
Foreach ADO |
指定 ADO 对象源变量和枚举器模式。 |
|
Foreach ADO.NET 架构行集 |
指定与数据库的连接和要枚举的架构。 |
|
Foreach 文件 |
指定要枚举的文件夹和文件、检索到的文件的文件名格式,以及是否要遍历子文件夹。 |
|
Foreach 源变量 |
指定包含要枚举的对象的变量。 |
|
Foreach 项 |
定义 Foreach 项集合中的项,包括列和列数据类型。 |
|
Foreach Nodelist |
指定 XML 文档的源并配置 XPath 操作。 |
|
Foreach SMO |
指定与数据库的连接以及要枚举的 SMO 对象。 |
下面看看具体如何使用该控件。假如我们在D:\SampleData含有如下文件:

现在我们用Foreach容器遍历这些文件。
>创建一个名为”ForeachContainerDemo”的包。然后定义一个变量FileName,类型设置为String。
>按如下图拖放控件

>右击”遍历货币”单击编辑。按如下图配置信息

其中 文件属性中设置".txt"表示 读取指定目录下的所有txt文件。然改为a.txt表示读取目录下指定的文件。
>单击变量映射选项,配置如下:

该配置表示,每次遍历的文件名赋值给变量FileName.然后点击确定。至此Foreach容器配置完毕。
>配置脚本任务和上一篇配置相同。只是做如下改动即可。修改 ReadOnlyVariables属性值为“User::FileName”,并在Main函数中写下如下代码。
string fileName = Dts.Variables["FileName"].Value.ToString();
MessageBox.Show(fileName);
>执行包。将遍历所以文本文件。结束后的效果如下:

序列容器
序列容器是一种十分简单,但使用非常广泛的容器,它可以对控制流的任务流组件进行结构化处理,把一些业务相关的任务组件,放到一个序列容器中,使整个包看起来更加整洁、美观,就如同我们家里的书柜、衣柜似的,把不同种类的东西整理在里面,收藏起来,既美观,又易于取用。它是将一个或多个控件作为一个工作单元来处理。例如:

在图中名为“Prepare New DataBase”的序列容器包含三个执行Sql任务的控件。是将这三个控件组合成一个控件。只有三个控件都执行成功后,才能继续执行下面的流程。序列容器的作用就是这些。不需要配置,也不要编写代码。只要将控件拖放到序列容器即可。有点类似我们C# 中用户控件一样。
到此本篇的内容就结束。主要是介绍For容器控件的使用。顺便介绍一下序列容器控件。
SSIS包由一个控制流以及一个或多个数据流(可选)组成。下面的关系图显示具有一个容器和六项任务的控制流。
这些任务中有五项定义于包级别,还有一项定义于容器级别。任务位于容器内。在控制流中的工具箱.我们可以将工具箱中的控件分为容器控件和任务控件两类。现在我们先了解一下容器包含哪些控件
容器
1.For循环
For循环容器类似于编成语言中的For循环结构。循环每次重复时,For循环容器都计算一个表达式并重复运行其循环,直到表达式计算结果为False才结束次循环。
For容器使用很简单。这里就简单介绍一下使用方法。
>BIDS开发工具打开创建的“SSISDemo”项目,然后创建一个新的包。命名为“ForContainerDemo”
>在工具左边选中变量选项卡,如果没有该选项,则可以在菜单上选中”SSIS”菜单,然后单击变量。弹出如下图:

在这里我们可以自己创建变量。单击上图中的第一个图标。创建一个变量。创建好后,可以设置其数据类型,初始值。结果如下图:

你也可以单击第二个图标,删除其变量。
>选中控制流选项卡后,在左边将出现工具选项卡,打开选项卡,将For循环容器拖到控制流中。然后再将一个脚本任务控件拖放到For容器中如图:

>右击For容器,单击编辑,弹出对话框

我们将看到如下属性
InitExpression :提供初始化该循环所用值的表达式(可选)。
EvalExpression :提供用于计算循环应停止还是继续的表达式。
AssignExpression :提供在每次循环重复时更改条件的表达式(可选)。
Name :为 For 循环容器提供唯一的名称。此名称用作任务图标中的标签。
Description :提供 For 循环容器的说明。
依据这些属性按如下图设置。

其中Count变量就是我们在变量容器中设置的变量,在使用变量时在其前面加上“@”。单击确定按钮即可
>拖放一个脚本任务控件到For容器中,然后右击脚本任务-〉选择编辑。弹出对话框。在ReadOnlyVariables属性中单击右边的“…”按钮,弹出选择变量对话框。在这对话框中我们选中自己定义的Count变量。配置结果如下:

>接着单击图上的编辑脚本按钮。弹出VS编辑器。在main函数中加入如下代码:
string Count = Dts.Variables["Count"].Value.ToString();
MessageBox.Show(Count);
然后关闭VS编辑器。最后关闭脚本任务编辑器
>右键单击“ForContainerDemo”包,选择执行包,结果如图:

我们发现弹出五次对话框。说明For容器循环了5次。最终执行结果如下。

到此,For循环容器控件介绍完成。接着我们介绍下一个Foreach循环容器。相信大家看到Foreach字词。估计也猜出如何使用该控件了吧。
上一篇我们通过一个示例来介绍一下SSIS 包的开发.接下来的内容我们将学习一下包中各个选项卡的使用.如:连接管理器选项卡、控制流选项卡、数据流选项卡和事件处理选项卡等等。这一篇将介绍一下连接管理器作用以及使用情况。
连接管理器的作用是连接到不同类型的数据源以提取和加载数据。任何包的开发都需要提供源数据。
下表列出了 SQL ServerIntegration Services 提供的连接管理器类型。
|
类型 |
说明 |
|
ADO |
连接到 ActiveX 数据对象 (ADO) 对象。 |
|
ADO.NET |
使用 .NET 提供程序连接到数据源。 |
|
CACHE |
从数据流或从缓存文件 (.caw) 中读取数据,并可将数据保存到缓存文件。 |
|
EXCEL |
连接到 Excel 工作簿文件。 |
|
FILE |
连接到文件或文件夹。 |
|
FLATFILE |
连接到单个平面文件中的数据。 |
|
FTP |
连接到 FTP 服务器。 |
|
HTTP |
连接到 Web 服务器。 |
|
MSMQ |
连接到消息队列。 |
|
MSOLAP100 |
连接到 SQL ServerAnalysis Services 实例或 Analysis Services 项目。 |
|
MULTIFILE |
连接到多个文件和文件夹。 |
|
MULTIFLATFILE |
连接到多个数据文件和文件夹。 |
|
OLEDB |
使用 OLE DB 访问接口连接到数据源。 |
|
ODBC |
使用 ODBC 连接到数据源。 |
|
SMOServer |
连接到 SQL Server 管理对象 (SMO) 服务器。 |
|
SMTP |
连接到 SMTP 邮件服务器。 |
|
SQLMOBILE |
连接到 SQL Server Compact 数据库。 |
|
WMI |
连接到服务器,并指定服务器上 Windows Management Instrumentation (WMI) 管理的范围。 |
下面就简单的介绍一下我们常用的使用连接管理器类型。
- OLE DB 访问接口连接到数据源(数据库连接)
- 首先打开上一篇创建名为"SSISDemo"项目.
- 在连接管理器窗口中,右击选择New OLE DB Connnection项,将弹出如下窗口:

左边数据连接框显示的连接是我们已创建好的数据库连接。右边数据库连接属性框显示对应的属性信息。你也可以新建一个数据库连接。单击新建按钮,弹出如下对话框

在这对话框中,我们可以根据自己的需要填写相应的内容。本例是以连接本地AdventureWorks数据库。单击确定按钮。则会在连接管理器看到如下信息:

图中LocalHost.AdventureWorks.sa就是我们刚才创建的数据库连接。右击LocalHost.AdventureWorks.sa弹出属性框。可以根据需要修改这些属性。比如将Name属性修改为: AdventureWorks 。 到此一个 简单OLE DB连接方式建立完成。其中的一些属性含义。自己可以在后续的学习中逐步的掌握。
- FILE连接到文件或文件夹(平面文件连接)
平面文件连接管理器要比OLE DB连接方式要复杂的多。平面文件连接方式主要是连接非数据库类型的文件。下面介绍下如何创建平面文件连接。假如我们有一个名为User.txt文件。数据格式如下:

每行有两列数据。已“Tab”隔开。接下来介绍如何在连接管理器中连接这个文本文件。
- 仍然在连接管理器框中右击,选中新建平面文件连接,弹出对话框

在图中可以看到配置平面文件连接管理器需要配置连接管理器名称、常规、列、高级、预览这个属性。下面将介绍如何配置这些属性
- 连接管理器名称:为工作流中的平面文件连接提供唯一的名称。所提供的名称将在连接管理器框中显示。
- 常规选项卡:使用“平面文件连接管理器编辑器”对话框的“常规”页可以选择文件和数据格式。使用平面文件连接可以将包连接到文本文件。该选项卡中包含以下属性:文件名:键入要在平面文件连接中使用的路径和文件名。
区域设置:在区域设置下拉框中选中指定的区域位置,以便为排序以日期和时间格式提供语言特性的信息。在设计的时候最好选择英语(美国)选项
Unicode复选框:指示是否使用Unicode。如果使用Unicode则不能指定代码页。
代码页:在代码页中选中指定非Unicode文本的代码页。设计时最好选择1252(ANSI-拉丁语I)格式:在格式下拉框中选中文本的格式
| 属性 | 说明 |
| 带分隔符 | 各列之间由在“列”页上指定的分隔符隔开 |
| 固定宽度 | 列的宽度固定 |
| 右边未对齐 | 在右边未对齐的文本中,除最后一列之外的每一列的宽度都相同。它有行分割符分割 |
文本限定符:指定要使用的文本限定符。例如,可以指定文本字段必须用引号括起来。若选择文本限定符之后,就不能重新选择"无"选项,键入None以取消选择文本限定 符。
标题行分隔符:从标题行的分隔符列表中选择,或输入分隔符文本。
|
值 |
说明 |
|
{CR}{LF} |
标题行由回车符和换行符的组合分隔。 |
|
{CR} |
标题行由回车符分隔。 |
|
{LF} |
标题行由换行符分隔。 |
|
分号 {;} |
标题行由分号分隔。 |
|
冒号 {:} |
标题行由冒号分隔。 |
|
逗号 {,} |
标题行由逗号分隔。 |
|
制表符 {t} |
标题行由制表符分隔。 |
|
竖线 {|} |
标题行由竖线分隔。 |
要跳过的标题行数:指定要跳过的标题行数或初始数据行数(如果有的话)。
在第一个数据行中显示列名称:指示在第一个数据行中是否要求列名或提供列名。
根据常规选项卡中的这些属性以后,我们就可以根据需求设定文本显示的格式。如下图

- 列选项卡:使用”平面文件连接管理器编辑器”对话框中的”列”选项卡可以在这里设置行和列的信息。并预览相应的文件。如下图:

包含如下属性
行和列分隔符:此属性和常规选项卡中的标题行分隔符一样。可以根据需求设置行和列的显示方式。
预览: 查看平面文件中的示例数据,这些数据已按所选的选项划分为列和行.如上图。
刷新:通过单击“刷新”查看更改要跳过的分隔符后的效果。只有在更改行或列选项之后,此按钮才可见。
重置列:通过单击“重置列”可以删除除原始列之外的所有列。 只有调转到其他选项卡后,然后再回到“列”选项卡,此按钮才可见。
本示例我们在列分隔符选项中选择制表符(t),然后单击刷新按钮。
- 高级选项卡:使用“平面文件连接管理器编辑器”对话框的“高级”页,设置指定 Integration Services 如何读写平面文件中的数据的属性。可以更改平面文件中各个列的名称,并设置包括文件中每个列的数据类型和分隔符在内的属性。默认情况下,字符串列的长度为 50 个字符。可以调整这些列的长度,以免数据截断或超出列宽。还可以更新其他元数据以便与目标列兼容。例如,可以将只包含整型数据的列的数据类型更改为数值数据类型,例如 DT_I2。可以手动进行这些修改,也可以单击“选择类型”按钮,以使用“提供列类型建议”对话框来评估示例数据并自动进行其中一些更改。在高级选项卡中我们可以做如下工做:
配置各列的属性:选择左窗格中的列可在右窗格中查看列的属性。请参阅下表以了解数据类型属性的说明。列出的部分属性仅对某些平面文件格式是可配置的。
|
属性 |
说明 |
|
ColumnType |
表示列是由分隔符分隔、还是固定宽度,或是右边未对齐。此属性是只读的。在右边未对齐的文件中,除最后一列之外的每一列的宽度都固定。它由行分隔符分隔。 |
|
OutputColumnWidth |
指定值存储为字节数;对于 Unicode 文件,此值对应于字符数。在数据流任务中,此值用于设置平面文件源的输出列宽。 注意 在对象模型中,此属性的名称为 MaximumWidth。 |
|
DataType |
从可用数据类型的列表中进行选择。 |
|
TextQualified |
指示文本数据周围是否有文本限定符(例如引号字符)。 值说明 True平面文件中的文本数据是受限定的。 False平面文件中的文本数据是不受限定的。 |
|
Name |
提供说明性列名。如果不输入名称,则 Integration Services 将自动创建名称,格式为“列 0”、“列 1”,依此类推。 |
|
DataScale |
指定数字数据的小数位数。小数位数是指小数点后的位数。 |
|
ColumnDelimiter |
从可用列分隔符的列表中进行选择。选择不可能出现在文本中的分隔符。对于固定宽度的列,将忽略此值。 值说明 {CR}{LF}列由回车符和换行符的组合分隔。 {CR}列由回车符分隔。 {LF}列由换行符分隔。 分号 {;}列由分号分隔。 冒号 {:}列由冒号分隔。 逗号 {,}列由逗号分隔。 制表符 {t}列由制表符分隔。 竖线 {|}列由竖线分隔。 |
|
DataPrecision |
指定数字数据的精度。精度是指数字的位数。 |
|
InputColumnWidth |
指定值以字节数进行存储;对于 Unicode 文件,该值将显示为字符数。对于分隔列,将忽略此值。 注意 在对象模型中,此属性的名称为 ColumnWidth。 |
新建:通过单击“新建”添加一个新列。默认情况下,单击“新建”按钮将会在列表末尾添加新列。该按钮还包括以下选项,可以在下拉列表中选择。
|
值 |
说明 |
|
添加列 |
在列表末尾添加新列。 |
|
在其前插入 |
在所选列前面插入新列。 |
|
在其后插入 |
在所选列后面插入新列。 |
删除:选择一列,然后单击“删除”来删除该列。
建议类型:使用“提供列类型建议”对话框可以计算文件中的示例数据,并获取关于每列的数据类型和长度的建议。
充分了解高级选项卡的属性后,我们将列0的Name和DataTye 属性改为CustomerID和DT_I8类型。将列1的Name和DataTye 属性改为SKUList和DT_STR类型,并将OutColumnWidth属性修改为1000。
- 浏览选项卡:单击浏览选项卡,可以看到如下图显示的数据

只要前三个选项卡配置成功后,预览一下数据显示格式就可以了。最后单击确定按钮。平面文件连接管理器就建立成功。最终在连接管理器框中显示刚才创建名为“Userout.txt“的平面文件管理器。
本节就介绍常用的两个连接管理器。其他的连接管理器可以参考这两个例子自己尝试去建立连接。
