🧾【教學】如何正確將 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)異常,多為上面錯誤連帶引起

🧩 根本解法原則(工程師思維)

  1. SQL Server 看不到你本機的檔案
    → 必須把檔案放到「SQL Server 主機」的資料夾中

  2. SQL Server 是用服務帳號在執行
    → 要把資料夾權限開給 NT SERVICE\MSSQLSERVER 或對應帳號

  3. BULK INSERT 無法解析 CSV 引號、內含逗號等複雜格式
    → 建議轉為乾淨的 .tsv(Tab 分隔)

  4. 檔案編碼要符合你設定的 DATAFILETYPE

    • char → 用於 UTF-8(搭配 CODEPAGE=65001

    • widechar → 用於 UTF-16(常見於 Notepad、Excel 另存)


📥 正確轉檔步驟(使用 PowerShell)

將 CSV 轉為 UTF-8 編碼、無 BOM 的 .tsv

$src = "D:\資料來源\來源檔.csv" $dst = "C:\Import\轉換後.tsv" Import-Csv $src | Export-Csv $dst -Delimiter "`t" -NoTypeInformation -Encoding utf8

📦 建立可匯入的暫存表(全部欄位先用文字型別)

IF OBJECT_ID('dbo.暫存表') IS NOT NULL DROP TABLE dbo.暫存表; CREATE TABLE dbo.暫存表 ( 欄位A nvarchar(4000), 欄位B nvarchar(4000), ... 欄位Z nvarchar(4000) );

🧪 BULK INSERT 正確範例(以 UTF-8 TSV 檔案)

BULK INSERT dbo.暫存表 FROM 'C:\Import\轉換後.tsv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n', CODEPAGE = '65001', DATAFILETYPE = 'char', TABLOCK, MAXERRORS = 0 );

📌 如果你使用 DATAFILETYPE='widechar',就不用加 CODEPAGE,但檔案必須是 UTF-16 編碼。


🔁 將暫存資料轉型寫入正式資料表

這段程式碼會自動將空字串轉為 NULL,並用 TRY_CONVERT() 避免轉換錯誤:

INSERT INTO dbo.正式表 (欄位A, 欄位B, 欄位Z) SELECT TRY_CONVERT(int, NULLIF(LTRIM(RTRIM(欄位A)), '')) AS 欄位A, TRY_CONVERT(datetime, NULLIF(LTRIM(RTRIM(欄位B)), '')) AS 欄位B, NULLIF(欄位Z, '') AS 欄位Z FROM dbo.暫存表;

✅ 成功匯入的小抄

任務 推薦設定
格式 .tsv,用 Tab 分隔
編碼 UTF-8 無 BOM
SQL Server 語法 DATAFILETYPE = 'char' + CODEPAGE = '65001'
欄位太多 先用全 nvarchar(4000) 暫存,後轉型
欄位內含逗號/引號 不建議直接用 CSV,用 .tsv 取代

🧠 延伸建議

  • 若你每天都要匯入資料,請將 PowerShell + SQL 做成 自動批次檔

  • 若有逾千欄資料(如 SBIN1~SBIN1000),請用 FOR XML PATHSTRING_AGG() 自動產生 SQL 指令

  • 若有特殊權限需求,可將檔案放到 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA(預設 SQL Server 可讀)


🔚 結語

BULK INSERT 是 SQL Server 中強大但也很容易踩雷的工具。只要搞懂以下三件事:

  1. 檔案必須在伺服器上(不是你自己的電腦)

  2. 欄位分隔與檔案編碼必須精準設定

  3. 用暫存表 + TRY_CONVERT 清洗資料 → 穩定、安全

你就能穩定導入任何格式的檔案,再也不會被「4866」、「4860」搞瘋。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題