將Excel作為資料來源,將資料匯入資料庫,是SSIS的一個簡單的應用,下圖是示例Excel,資料列是code和name
第一部分,Excel中的資料型別是數值型別
1,使用SSDT建立一個package,建立Excel data source component,SSDT會在Connection Managers中建立一個Excel的connection
由於示例Excel的首行是列名,所以需要勾選"First row has column names",Excel connection manager 如下
2,資料來源元件將Excel中的資料讀取出來,並傳遞給其他元件,資料來源元件其實是有輸入和輸出的,輸入是指將Excel的資料匯入到資料來源元件中,輸出是指將資料來源元件中匯入的Excel資料向下傳遞。
開啟資料來源元件的Advanced editor,透過Show Advanced Editor來開啟
在Input and Output Properties選項卡中,External columns是Excel資料來源元件的輸入列,Output Columns是Excel資料來源元件的輸出列,每一列都是有DataType和CodePage。
預設情況下,SSIS的Excel聯結器將Excel中的數字作為數值型別來對待
對於External columns,可以根據實際需要修改DataType和CodePage,對於數值型別,不需要關注CodePage,但是對於字元型別,CodePage就必須匹配,否則package在run時就會fail。
由於示例Excel的兩列的值都是數字,SSIS預設設定DataType為數值型別,對於DataType,雖然可以修改,但是資料來源元件並不負責DataType的轉換,如果External columns 和Output Columns的DataType不相同,run的時候會丟擲error。如果需要convert DataType,需要使用Data Conversion 元件。
3,在db中建立接收Excel資料的表tbExcel,資料類似是Nvarchar,接收的資料是數值型,這樣並不會報錯。
create table dbo.tbExcel(code nvarchar(10),name nvarchar(10))
4,建立一個Oledb資料目標元件,開啟Advanced Editor,看到Ole db Destination Input 也有兩個:
External columns:是DB中的目標表的資料列及其屬性資訊,本例是指 tbExcel 表的列和屬性
Input Columns:是上游資料來源元件傳遞的資料列及其屬性資訊
5,設定資料來源元件和資料目標元件的列的mapping,execute package,成功匯入13 rows 資料
第二部分,將Excel中的資料型別修改為文字型別
6,如果Excel source 中的資料是文字型別,實現起來必須考慮CodePage。
修改示例Excel,將name列修改為文字型別
7,將Db中的目標表做修改,將資料列修改為varchar
if object_id('dbo.tbExcel') is not nulldrop table dbo.tbExcelcreate table dbo.tbExcel(code varchar(10),name varchar(10))
8,在execute package的過程中,ssis丟擲錯誤資訊,也就是說Excel中的文字使用的資料型別是unicode 的,而varchar並不是unicode,所以必須進行轉換,在package中加入Data converion元件進行轉換
===================================
Package Validation Error (Package Validation Error)
===================================
Error at Data Flow Task [OLE DB Destination [166]]: Column "name" cannot convert between unicode and non-unicode string data types.
Error at Data Flow Task [SSIS.Pipeline]: "OLE DB Destination" failed validation and returned validation status "VS_ISBROKEN".
Error at Data Flow Task [SSIS.Pipeline]: One or more component failed validation.
Error at Data Flow Task: There were errors during task validation.
(Microsoft.DataTransformationServices.VsIntegration)
9,execute package,仍然出錯,錯誤原因是Code Page 不匹配,在資料傳遞的過程中,不能將code page為1252的資料傳遞到codepage為936的目標表中
Error at Data Flow Task [OLE DB Destination [203]]: The column "Copy of name" cannot be processed because more than one code page (1252 and 936) are specified for it.
下圖是Ole db Destination Input,在External columns中檢視name的屬性,codepage是936,Input columns中檢視name的屬性,codepage是1252
由於列 copy of name是從Data Conversion中轉換而來的,所以只需要修改一下轉換後的資料列的CodePage就可以了。
10,設定列的mapping,再次Execute package,一路泛綠,成功匯入13 rows
第三部分,一點小總結
Excel的文字,預設的資料型別是Unicode,長度是255DB中的Varchar 不是unicode型別,nvarchar是unicode型別如果codepage不一致,可以透過data conversion元件進行轉換