🧾【教學】如何正確將 Excel/CSV 資料匯入 SQL Server:避免 4860、4863、4866 錯誤全攻略!
✨為什麼你會看到這篇文章?
你是否試圖將一份 .csv 或
.tsv 的資料檔匯入 SQL
Server,但卻不斷被神秘的錯誤代碼阻擋,例如:
-
訊息 4860:無法大量載入,找不到檔案 -
訊息 4863:資料轉換錯誤(截斷) -
訊息 4866:資料行對資料行 1 而言太長
放心,你不是孤單的,這是 SQL Server 在處理「檔案路徑、編碼、欄位數」錯誤時的常見行為。
這篇文章將用軟體工程師的角度,全流程示範如何把 CSV/TSV 成功匯入 SQL Server,並避免所有常見錯誤。
🧨 錯誤訊息快速解碼
| 錯誤代碼 | 發生原因 |
|---|---|
| 4860 | 檔案路徑錯誤,或 SQL Server 沒有權限讀取 |
| 4863 | 欄位長度不符,資料被截斷(通常是編碼或分隔符錯誤) |
| 4866 | 整行資料被塞到一欄,導致欄位爆長 |
| 7301 / 7330 | 資料連結提供者(BULK)異常,多為上面錯誤連帶引起 |
🧩 根本解法原則(工程師思維)
-
SQL Server 看不到你本機的檔案
→ 必須把檔案放到「SQL Server 主機」的資料夾中 -
SQL Server 是用服務帳號在執行
→ 要把資料夾權限開給NT SERVICE\MSSQLSERVER或對應帳號 -
BULK INSERT 無法解析 CSV 引號、內含逗號等複雜格式
→ 建議轉為乾淨的.tsv(Tab 分隔) -
檔案編碼要符合你設定的
DATAFILETYPE-
char→ 用於 UTF-8(搭配CODEPAGE=65001) -
widechar→ 用於 UTF-16(常見於 Notepad、Excel 另存)
-
📥 正確轉檔步驟(使用 PowerShell)
將 CSV 轉為 UTF-8 編碼、無 BOM 的
.tsv:
📦 建立可匯入的暫存表(全部欄位先用文字型別)
🧪 BULK INSERT 正確範例(以 UTF-8 TSV 檔案)
📌 如果你使用
DATAFILETYPE='widechar',就不用加
CODEPAGE,但檔案必須是 UTF-16
編碼。
🔁 將暫存資料轉型寫入正式資料表
這段程式碼會自動將空字串轉為 NULL,並用
TRY_CONVERT() 避免轉換錯誤:
✅ 成功匯入的小抄
| 任務 | 推薦設定 |
|---|---|
| 格式 |
.tsv,用 Tab 分隔
|
| 編碼 | UTF-8 無 BOM |
| SQL Server 語法 |
DATAFILETYPE = 'char'
+ CODEPAGE = '65001'
|
| 欄位太多 |
先用全
nvarchar(4000)
暫存,後轉型
|
| 欄位內含逗號/引號 |
不建議直接用 CSV,用
.tsv 取代
|
🧠 延伸建議
-
若你每天都要匯入資料,請將 PowerShell + SQL 做成 自動批次檔
-
若有逾千欄資料(如 SBIN1~SBIN1000),請用
FOR XML PATH或STRING_AGG()自動產生 SQL 指令 -
若有特殊權限需求,可將檔案放到
C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA(預設 SQL Server 可讀)
🔚 結語
BULK INSERT 是 SQL Server 中強大但也很容易踩雷的工具。只要搞懂以下三件事:
-
檔案必須在伺服器上(不是你自己的電腦)
-
欄位分隔與檔案編碼必須精準設定
-
用暫存表 + TRY_CONVERT 清洗資料 → 穩定、安全
你就能穩定導入任何格式的檔案,再也不會被「4866」、「4860」搞瘋。
留言
張貼留言