一 导出转换组件

  导出列转换读取数据流中的数据,并将数据插入到指定的文件中.次转换使用成对的数入列:一列是要输出的数据,一列是将这些数据输出到哪些文件里.转换在处理时,数据将插入到指定的文件中.如果这些文件不存在,转换将创建这些文件,然后将数据写入到文件中.要写入的数据必须具有DT_Text、DT_NTEXT或DT_IMAGE数据类型。

下面的例子中将介绍如何使用该转换工具。本例演示如何将数据库AdVentureWorks中Production.Document表中的Document列导出到文件中。

  1. 创建一个文件夹E:\SSIS\SSISDemo\Export,导入的文件将放在这个文件夹中。
  2. 新建一个名为ExportColumnDemo的包,在控制流中添加一个Data Flow Task。然后在连接管理器中创建一个OLEDB连接,用于连接AdventureWorks数据库。如图:

 

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

 

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

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

 

下面详细了解一下窗口中的允许追加、强制截取以及编写字节顺序列的含义:

列名

说明

允许追加

指定转换是否将数据追加到现有文件中。默认false

强制截取

指定转换在写入数据之前是否删除现有文件的内容。默认值为false

编写字节顺序

指定是否将字节数序标记(BOM)写入文件。只有在数据具有DT_TEXT或DT_NTEXT数据类型,并且未将数据追加到现有数据文件时,才会写入标记(BOM)

  1. 执行包,如图1-1,可以看到文件夹中已经有9个文件。见图:1-2

 

图1-1

 

图1-2

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

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

 

在 执行结果中看到如下错误信息

[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数据库中。

  1. 创建路径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。在常规和高级选项中设置如下: 

 

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

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

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

 

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

 

设置成功。警告信息消失。此时导入列转换配置成功。

  1. 托动一个派生列到数据流中与导入列转换相连。箭头指向派生列。设置派生列

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

 

  1. 设置成功后执行该包:

 

查看目标数据库中的MyImages表。如下:

导出、导入组件功能我们学习完毕。谢谢!

posted on 2012-04-14 16:11  guddujianxiao  阅读(5858)  评论(2编辑  收藏  举报