使用 SSIS 或 ADO.NET 將 Excel 匯入 SQL Server 2005 時,若某欄位文字超過 255 字元,常遇到「文字被截斷」或「外部欄位與輸出欄位不匹配」錯誤。Excel 來源的資料類型預設最長僅支援 NVARCHAR(255),甚至嘗試 NTEXT 仍無法解決。
Jet / ACE OLE DB 驅動程式預設只掃描前 8 列(TypeGuessRows=8)來推斷欄位資料類型與長度。若前 8 列皆短於 255 字元,驅動程式會將該欄位定義為 NVARCHAR(255),導致後續長資料被截斷。
OutputColumnWidth 設大(如 4000)。CodePage=65001。優點:不需修改登錄表,相容性佳。
缺點:需額外轉檔步驟,大檔案較慢。
TypeGuessRows = 0(推薦)讓驅動程式掃描「整欄」資料決定型別,超過 255 字元自動判定為 NTEXT(舊版)或 NVARCHAR(MAX)(新版)。
| 驅動程式 | 登錄表機碼路徑 |
|---|---|
| Jet 4.0 (32-bit Office) | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel |
| ACE 12.0 (Office 2007/2010) | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel |
| Windows Server 2003 x64 (WoW64) | HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel |
regedit,定位至對應機碼。TypeGuessRows(DWORD),將值從 8 改為 0。TypeGuessRows = 0。Extended Properties 設為 Excel 12.0;HDR=YES。LEFT()、MID() 將長欄位拆成多個 <255 字元的欄位。CONCAT() 或 + 合併還原。適用情境:無法修改伺服器登錄表的受管環境。
-- Jet 4.0
SELECT LEN(人員分工), *
FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";Extended Properties=Excel 8.0')...[Sheet1$]
ORDER BY LEN(人員分工) DESC;
-- ACE 12.0 (建議)
SELECT LEN(人員分工), *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=YES;IMEX=1;Database=c:\book1.xls', [Sheet1$])
ORDER BY LEN(人員分工) DESC;
IMEX=1 強制混合模式讀取,配合 TypeGuessRows=0 可正確讀取超長文字。
文章提供 登錄表修正檔下載(請依實際 Office 版本與位數選擇),雙擊匯入即可完成設定。