BULK INSERT dbo.TargetTable
FROM 'C:\Data\export.csv'
WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', CODEPAGE = '65001');
using (var reader = new CsvReader(new StreamReader("data.csv"), true))
using (var bcp = new SqlBulkCopy(connStr)) {
bcp.DestinationTableName = "dbo.TargetTable";
bcp.BatchSize = 5000;
bcp.WriteToServer(reader); // 需引用 CsvHelper 或自行實作 IDataReader
}
關鍵點:CsvReader 實作 IDataReader,避免全量載入記憶體;BatchSize 控制事務大小。
foreach (var line in File.ReadLines("data.csv").Skip(1)) {
var cols = line.Split(',');
using (var cmd = new SqlCommand(
"INSERT INTO T(Col1,Col2) VALUES(@c1,@c2)", conn)) {
cmd.Parameters.AddWithValue("@c1", cols[0]);
cmd.Parameters.AddWithValue("@c2", cols[1]);
cmd.ExecuteNonQuery();
}
}
注意:需處理逗號在引號內、換行符等 CSV 邊界情況,建議使用 TextFieldParser (VB.NET) 或 CsvHelper (C#)。
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| BULK INSERT / bcp | 超大文件、定時任務 | 最快、無需寫代碼 | 格式要求嚴格、難處理複雜轉換 |
| SqlBulkCopy + CsvHelper | 中大型、需預處理 | 高效、可管控、支援數據清洗 | 需引入第三方庫 |
| 逐行 INSERT | 小數據、邏輯複雜 | 彈性最大、易除錯 | 效能最差 |
CODEPAGE = 65001。FIRSTROW = 2 跳過表頭。Split(',') 會誤切,務必用正規 CSV 解析器。根據數據量、自動化需求、團隊技術棧選擇最合適方案;生產環境首推 SqlBulkCopy + CsvHelper 平衡效能與可維護性。