一 导出转换组件
导出列转换读取数据流中的数据,并将数据插入到指定的文件中.次转换使用成对的数入列:一列是要输出的数据,一列是将这些数据输出到哪些文件里.转换在处理时,数据将插入到指定的文件中.如果这些文件不存在,转换将创建这些文件,然后将数据写入到文件中.要写入的数据必须具有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表。如下:
导出、导入组件功能我们学习完毕。谢谢!