面對大量資料(GB 級以上)的匯出匯入,傳統 INSERT 陳述式效能極差。本文介紹兩大神器:BCP 公用程式與 OPENROWSET,並提供完整 C# 程式碼範例。
| 參數 | 說明 |
|---|---|
out | 資料表匯出至檔案 |
queryout | 查詢結果匯出至檔案 |
in | 檔案匯入資料表 |
-c | 字元模式(預設分隔符:Tab/換行) |
-t | 指定欄位分隔符(如 -t\",\") |
-r | 指定列分隔符(如 -r\"\\n\") |
-b | 批次大小(如 -b5000) |
-a | 網路封包大小(如 -a65535) |
-k | 保留 Null 值而非預設值 |
-F/-L | 指定起始/結束列號 |
public void WriteAllToFile(string fileName)
{
var cmds = new List();
// 1. 啟用 xp_cmdshell
cmds.Add("EXEC sp_configure 'show advanced options', 1; RECONFIGURE;");
cmds.Add("EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;");
// 2. 組裝 BCP 命令
string[] conn = PubConstant.MessageInfo(); // [Server, DB, User, Pass]
string bcpCmd = string.Format(
"EXEC {0}..xp_cmdshell 'bcp {0}.dbo.Department out {1} -c -U {2} -P {3} -S {4}'",
conn[1], fileName, conn[2], conn[3], conn[0]);
cmds.Add(bcpCmd);
// 3. 關閉 xp_cmdshell
cmds.Add("EXEC sp_configure 'show advanced options', 1; RECONFIGURE;");
cmds.Add("EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE;");
// 4. 依序執行
foreach (var cmd in cmds) DbHelperSQL.ExecuteSql(cmd);
}
-k 參數保留 Null,或在查詢中用 ISNULL/COALESCE 替換public void ReadFromAccess(string fileName)
{
var cmds = new List();
// 啟用 Ad Hoc Distributed Queries
cmds.Add("EXEC sp_configure 'show advanced options', 1; RECONFIGURE;");
cmds.Add("EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;");
// OPENROWSET 查詢
string query = @"SELECT CustomerID, CompanyName
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\testFile\Northwind.mdb';'admin';'', Customers)";
cmds.Add(query);
// 關閉選項
cmds.Add("EXEC sp_configure 'Ad Hoc Distributed Queries', 0; RECONFIGURE;");
cmds.Add("EXEC sp_configure 'show advanced options', 0; RECONFIGURE;");
foreach (var cmd in cmds) DbHelperSQL.ExecuteSql(cmd);
}
'Microsoft.Jet.OLEDB.4.0' 或 'Microsoft.ACE.OLEDB.12.0' (Access 2007+)'Microsoft.ACE.OLEDB.12.0';'Excel 12.0;HDR=YES;IMEX=1''SQLNCLI';'Server=IP;Database=DB;UID=user;PWD=pass'xp_cmdshell、Ad Hoc Distributed Queries 權限BCP 與 OPENROWSET 是 DBA 與開發人員處理大量資料的利器。理解其參數細節、限制與安全性考量,能在適當場景發揮最大效能。現代架構下,建議將複雜 ETL 遷移至 SSIS 或 Azure Data Factory,保留 BCP/OPENROWSET 為輕量級補充工具。