BULK INSERT 是 SQL Server 將外部數據文件高效批量載入表/視圖的核心命令,性能遠超逐行 INSERT。本文完整梳理所有參數語法、核心參數場景解析,並給出生產級範例模板。
BULK INSERT [database_name.[schema_name].|schema_name.][table_name|view_name]
FROM 'data_file'
WITH (
[BATCHSIZE = batch_size], -- 每批行數,每批一事務
[CHECK_CONSTRAINTS], -- 檢查約束(預設忽略)
[CODEPAGE = 'ACP'|'OEM'|'RAW'|code_page], -- 字符編碼頁
[DATAFILETYPE = 'char'|'native'|'widechar'|'widenative'], -- 文件格式
[FIELDTERMINATOR = 'field_terminator'], -- 字段分隔符(預設 \t)
[FIRSTROW = first_row], -- 起始行號(預設 1)
[FIRE_TRIGGERS], -- 觸發 INSERT 觸發器
[FORMATFILE = 'format_file_path'], -- 格式化文件(bcp 生成)
[KEEPIDENTITY], -- 保留文件中的標識列值
[KEEPNULLS], -- 保留空值而非默認值
[KILOBYTES_PER_BATCH = kb], -- 每批近似 KB 數
[LASTROW = last_row], -- 結束行號(預設 0=末尾)
[MAXERRORS = max_errors], -- 最大錯誤容忍(預設 0)
[ORDER (column [ASC|DESC] ...)], -- 數據文件排序順序(匹配聚簇索引提速)
[ROWS_PER_BATCH = rows_per_batch], -- 每批行數(無 BATCHSIZE 時用)
[ROWTERMINATOR = 'row_terminator'], -- 行分隔符(預設 \n)
[TABLOCK], -- 表級鎖(減少鎖升級,大幅提速)
[ERRORFILE = 'file_name'] -- 錯誤行導出文件
);
| 參數 | 關鍵作用 | 典型場景 |
|---|---|---|
BATCHSIZE | 控制事務大小,避免超大事務撐爆日誌/鎖 | 百萬級導入建議 1000-5000 行/批 |
TABLOCK | 獲取表級鎖,跳過行/頁鎖升級,並行導入無索引表時極快 | 全量初始化、數據倉庫夜ly載入 |
FIELDTERMINATOR / ROWTERMINATOR | 匹配文件實際分隔符(CSV 用 ,,TSV 用 \t,行尾 \n 或 \r\n) | 異構系統文件對接 |
FIRSTROW / LASTROW | 跳過表頭、只導入片段 | 文件含標題行、分片導入 |
CHECK_CONSTRAINTS | 強制驗證 CHECK/FOREIGN KEY,預設關閉為了速度 | 數據質量要求高、信任度低的外部文件 |
KEEPIDENTITY | 文件含自增值需保留時必開 | 跨環境遷移、主鍵業務含義強 |
FORMATFILE | 文件列順序/數量/類型與表不一致時的映射橋樑 | 歷史文件格式固定、不想改表結構 |
ORDER | 聲明文件已按聚簇索引鍵排序,載入時跳過排序 | 已排序的大文件導入聚簇索引表 |
ERRORFILE | 導入失敗行自動導出,便於清洗重試 | 髒數據比例不可控的文件 |
BULK INSERT Northwind.dbo.[Order Details]
FROM 'F:/orders/lineitem.tbl'
WITH (
FIELDTERMINATOR = '|',
ROWTERMINATOR = '|\n',
FIRSTROW = 2, -- 跳過標題行
CODEPAGE = '65001', -- UTF-8
TABLOCK, -- 表鎖提速
BATCHSIZE = 5000,
MAXERRORS = 100,
ERRORFILE = 'F:/orders/lineitem_err.log'
);
BULK INSERT xsxt.dbo.tabletest
FROM 'C:/data.txt'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRE_TRIGGERS,
KEEPIDENTITY,
CHECK_CONSTRAINTS,
TABLOCK
);
-- 1. 用 bcp 生成格式文件 -- bcp db.dbo.table format nul -c -t, -r\n -f fmt.xml -T -- 2. 導入時引用 BULK INSERT db.dbo.table FROM 'data.csv' WITH (FORMATFILE = 'C:/fmt/fmt.xml', FIRSTROW=2, TABLOCK);
sysadmin 和 bulkadmin 固定服務器角色可執行。BATCHSIZE,回滾會回滾所有已提交批次。TABLOCK + BULK_LOGGED 恢復模式可最小化日誌量。\\Server\Share\file.txt)。BULK INSERT 是 ETL、數據遷移、初始化載入的利器,掌握參數組合拳,導入速度可提升 10-100 倍。