問題描述:
[Excel 源 [1]] 錯誤: 輸出“Excel 源輸出”(9) 上的 輸出列“Description 3”(546) 出錯。返回的列狀態是:“文本被截斷,或者一個或多個字符在目標代碼頁中沒有匹配項。”。
該列在excel中最長為308個字符,但是Excel源中的外部列和輸出列最多只能設為Nvarchar(255),如果設定長度超過255,則出現警告,源列屬性不匹配,執行也通不過。使用Ntext類型也嘗試過,不匹配。
我使用ado.Net倒是把它倒入到數據庫了,但是發現所有超過255的都被截斷了。
原因分析:
ADO和SSIS的Excel源對數劇列的長度的判定存在問題。
解決方案一:
把Excel轉換成CSV格式,然後使用平面文件源導入數據庫。
需要注意兩點:
1、輸出列長度需要手動修改。
2、注意不同語言造成的Unicode字符轉換問題,必要時先切換系統語言,再作轉換。
解決方案二:
將注冊表中
Jet引擎.
HKEY_LOCAL_MacHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel
如果是:ACE引擎.
HKEY_LOCAL_MacHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel
下的TypeGuessRows 項的值設置為0
Windows server 2003 系統注冊表中,JET項位於HKEY_LOCAL_MacHINE\SOFTWARE\MicrosoftWow64Node\下
原因是驅動默認情況下根據列的前8行數據判定列長度,修改為0後需要檢查整列數據來判定列長度,超過255個字符默認為ntext格式,少於255個字符則默認為nvarchar(255)。
添加一個數據流.在數據流裡.添加一個OLEDB源.
新建一個Excel的oledb源.在這裡就不說了.
只需要將Provider設置為Microsoft Ace Oledb.然後選擇Excel文件.
然後設置Extended PropertIEs屬性為Excel 12.0;HDR=YES
解決方案三:
使用函數將長度超過255個字符的列切割為多個少於255的列,導入數據庫後在進行合並。
注意Excel的選擇性粘貼功能。
可用函數:Left ,Mid
經過我測試,通過!
下載注冊表文件
SELECT len(convert(varchar(1000),人員分工)),* FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\book1.xls";User ID=Admin;PassWord=;Extended propertIEs=Excel 5.0')...[Sheet1$]order by len(人員分工) desc--select * from Table1
select len(人員分工),* from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=c:\book1.xls', 'select 人員分工,* from [Sheet1$]') order by len(人員分工) descselect * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=c:\book1.xls', [Sheet1$]) order by len(人員分工) desc
select len(人員分工),* from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=c:\book1.xls;Extended PropertIEs="Excel 12.0;HDR=Yes;IMEX=0"')...[Sheet1$]order by len(人員分工) desc