一 導出轉換組件
導出列轉換讀取數據流中的數據,並將數據插入到指定的文件中.次轉換使用成對的數入列:一列是要輸出的數據,一列是將這些數據輸出到哪些文件里.轉換在處理時,數據將插入到指定的文件中.如果這些文件不存在,轉換將創建這些文件,然后將數據寫入到文件中.要寫入的數據必須具有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表。如下:
導出、導入組件功能我們學習完畢。謝謝!
