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.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號