BULK INSERT 是 SQL Server 內置的高性能批量導入命令,適用於 CSV、TSV、固定寬度等文本格式,比逐行 INSERT 快數十倍,且無需外部 ETL 工具。
USE TestData;
GO
CREATE TABLE CSVTest (
ID INT,
FirstName VARCHAR(40),
LastName VARCHAR(40),
BirthDate SMALLDATETIME
);
GO
路徑:C:\csvtest.txt
內容(無表頭,逗號分隔,換行結束):
1,James,Smith,19750101
2,Meggie,Smith,19790122
3,Robert,Smith,20071101
4,Alex,Smith,20040202
BULK INSERT CSVTest
FROM 'C:\csvtest.txt'
WITH (
FIELDTERMINATOR = ',', -- 字段分隔符
ROWTERMINATOR = '\n', -- 行分隔符(Windows 為 \r\n)
FIRSTROW = 1, -- 從第 1 行開始(如有表頭設為 2)
MAXERRORS = 0, -- 遇錯誤立即停止,改為 >0 可跳過錯誤行
TABLOCK -- 表級鎖,提升大批量導入性能
);
GO
SELECT * FROM CSVTest;
GO
| 參數 | 說明 | 常用值 |
|---|---|---|
| FIELDTERMINATOR | 字段分隔符 | ','、'\t'、'|' |
| ROWTERMINATOR | 行分隔符 | '\n' (Linux)、'\r\n' (Windows) |
| FIRSTROW | 起始行號 | 1(無表頭)、2(有表頭) |
| MAXERRORS | 最大容錯行數 | 0(全對)、1000(允許跳過) |
| ERRORFILE | 錯誤行輸出文件 | 'C:\err.log' |
| CODEPAGE | 字符編碼 | 'RAW'、'ACP'、'65001'(UTF-8) |
| DATAFILETYPE | 文件類型 | 'char'、'native'、'widechar' |
| TABLOCK | 導入期間獲取表級鎖 | 大幅提升性能,導入期間表不可讀寫 |
當文件列順序、數量與表不一致,或需跳過某列時,使用 .fmt 格式文件:
BULK INSERT CSVTest
FROM 'C:\data.txt'
WITH (FORMATFILE = 'C:\csv.fmt');
-- 簡單版:配合 BATCHSIZE
BULK INSERT CSVTest
FROM 'C:\big.csv'
WITH (BATCHSIZE = 50000, TABLOCK);
BULKADMIN 服務器角色或 ADMINISTER BULK OPERATIONS 權限。