SSIS高级转换任务—导入列
在SQL Server 2005的beta版本中导入列任务命名为插入列转换,他和导出列任务是一对经常搭配使用的任务,在SQL Server 2005的beta版本中导出列任务命名为文件抽取。当我们搞清楚它们实现什么功能的时候会发现原来的名字更加贴切。这种转换将系统文件路径中的物理文件转化为数据库中的表数据,反之亦然。理解输入列任务的关键是输入源中至少有一列保存将要导入到数据库中的文件的路径,还需要目标列保存文件和文件路径。这种转换的主要配置仍然使用高级编辑。
我们称之为高级编辑可能就因为它不够直观,有点麻烦,也没有类似于向导一样的设置,但是熟悉之后使用它将会很方便。在高级编辑中没有类似将两列合并成一列这样的设置所以如果源数据中文件路径和文件名字是分离的,需要使用Merge转换将他们连接起来。
导入列实例
导入列例子现在来做一个例子,将图像文件导入到AdventureWorks数据库中。新建一个包命名为ImportColumnExample,添加一个Data Flow Task,在Data Flow界面拖放一个Import Column transformation,按照下面步骤设置包:
- 创建路径C:\Users \Pictures\MyPicture
- 随便在路径C:\Users\Pictures\MyPicture中粘贴3个比较小的图像文件命名为1.jpg,2.jpg,3.jpg
- 在路径C:\Users\Pictures\MyPicture内创建一个txt文件命名为filelist.txt,文件内容如下
ImageFilePath
C:\Users \Pictures\MyPicture\1.jpg
C:\Users \Pictures\MyPicture\2.jpg
C:\Users \Pictures\MyPicture\3.jpg - 运行下面的sql语句创建表
1 use AdventureWorks
2 Go
3 CREATE TABLE dbo.tblmyImages
4 (
5 [StoredFilePath] [varchar](50) NOT NULL,
6 [Document] image
7 ) - 使用filelist.txt作为要载入到数据库中的文件的流,添加一个Flat File Source,filelist.txt作为数据源
- 新建一个package命名为ImportColumn.dtsx,在Control Flow中新添加一个Data Flow Task双击进入Data Flow
- 添加一个Flat File Source,右击Flat File Source,选择Show Advanced Editor,它和直接双击打开的编辑界面有所不同,没有设置向导,直接对属性进行设置。可能觉得一团乱麻不好辨别,但是在最糟糕的情况下你可以直接删除重新设置。高级编辑界面如下图6-5:
图6-5 - 在这个例子中,Flat File Source不需要使用高级编辑界面,Import Column Transormation需要,他们的高级编辑界面很类似。在Import and Output Properties标签界面有两个文件夹结点External Columns和Output Columns,他们都有一个子结点ImageFilePath,这个Flat File Source要输出的数据列名和数据源中的列名一致都是ImageFilePath。Column Mappings标签内显示映射关系,如果将filelist.txt内的列名改为myImageFilePath那么这里也将显示为myImageFilePath。我们还会看到属性ID是16,ExternalMetaDataColumnID是15。这表示这个转换任务将源输入和输出连接起来。我们注意到下面有Add Output和Remove Output两个按钮但是在这个任务中不能配置这个选项。这里他的作用是将文件中的字符转换成字符流。
- 将Flat File Source和Import Column连接起来。打开Import Column任务的高级编辑选项,选择Input Column标签,它的输入流是Flat File Source的输出流,点击选中ImageFilePath,切换到Input and Output Propertitis界面,如图6-6,输入列集合中有一列ImageFilePath,但是在输出列集合中没有。在Flat File Source可以忽略输入,但是在这里所有的输入都需要有对应输出,事实上如果没有输出会有下面的错误提示: Validation error. Data Flow Task: Import Column [1]: The "input column "ImageFilePath" (164)" references output column ID 0, and that column is not found on the out put.
图6-6 - 选中Output Columns文件夹,点击Add Column按钮添加新列命名为myimage。注意到DataType属性是image [DT_IMAGE],这是因为输入流中是图像文件,这里夜课仪选择DT_TEXT,DT_NTEXT或者DT_IMAGE。最后需要将输入和输出连接起来,这里注意到myImage列的ID属性是77,这里需要将Input Column集合中ImageFilePath的FileDataColumnID属性设置为77,否则可能如下的错误提示:Validation error. Data Flow Task: Import Column [1]: The "output column "myImage" (207)" is not referenced by any input column. Each output column must be referenced
by exactly one input column.意思是myImage没有被input column引用到,每一个输出必须有一个对应输入。这里注意如果有多个列,还应设置Input Columns中对应的MappedColumnID属性。 - 最后添加OLE DB Desination,将Import Column和Ole DB Destination连接起来,编辑Ole DB Destination设置为如上创建的表,点击Mappings setting设置列映射最后运行包,界面如下图6-7:
图6-7
最后在数据库中使用语句select * from tblmyImages,得到类似如下的数据结果:
FullFileName Document
---------------------- -----------------------------------
C:\import\images\1.JPG 0xFFD8FFE120EE45786966000049492A00...
C:\import\images\2.JPG 0xFFD8FFE125FE45786966000049492A00...
C:\import\images\3.JPG 0xFFD8FFE1269B45786966000049492A00...
(3 row(s) affected)
作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火