將資料表匯出為文字檔(CSV、TSV、固定寬度)是資料交換、遷移、備份的常態需求。本文詳細對比 BCP 命令列工具與 DTS/SSIS 匯入匯出精靈的語法、參數、效能特性與適用場景,並提供生產級範本腳本。
方法一:BCP (Bulk Copy Program) — 高效能、自動化首選
基本語法架構
bcp {[[database_name.][schema.]]{table_name | view_name} | "query"}
{in | out | queryout | format} data_file
[options...]
核心參數速查表
| 參數 | 功能 | 常用值/範例 |
| -S | 目標伺服器[\實例] | -S localhost\SQL2019 |
| -U / -P | SQL 驗證帳號/密碼 | -U sa -P "P@ssw0rd" |
| -T | 信任連線 (Windows 驗證) | 推薦生產環境使用 |
| -c | 字元模式 (char),Tab 分欄、換行分列 | 最通用、可直接開 Excel |
| -w | Unicode 字元模式 (nchar),支援中文 | 含中文資料必加 |
| -N | 原生非字元 + Unicode 字元,效能最佳 | SQL Server 之間傳輸首選 |
| -n | 原生資料類型 (二進位),最快但不可讀 | 純 SQL Server 環境備份 |
| -t | 欄位分隔符 | -t, (CSV), -t\t (TSV) |
| -r | 列結束符 | -r\n (預設), -r\r\n |
| -F / -L | 起始/結束列號 | 分批匯出大表 |
| -b | 批次大小 | -b 10000 控制交易大小 |
| -e | 錯誤檔路徑 | -e err.log |
| -f | 格式檔路徑 | 複雜格式預先定義 |
| -h | 大量載入提示 | -h "TABLOCK, CHECK_CONSTRAINTS" |
| -q | 啟用 QUOTED_IDENTIFIER | 物件名含空格/保留字時需加 |
實戰範例
-- 1. 匯出整張表為 UTF-8 CSV (含標頭需額外處理)
bcp "SELECT * FROM Sales.Orders" queryout "C:\Export\Orders.csv" -S . -T -c -t, -r\n -C 65001
-- 2. 匯出指定查詢結果 (需用 queryout)
bcp "SELECT OrderID, CustID, OrderDate FROM Sales.Orders WHERE OrderDate >= '2024-01-01'" queryout "C:\Export\Orders_2024.csv" -S . -T -w -t, -r\n
-- 3. 匯入 CSV 到資料表 (需目標表存在)
bcp Sales.Orders in "C:\Import\Orders.csv" -S . -T -c -t, -r\n -F 2 -h "TABLOCK, CHECK_CONSTRAINTS" -e "C:\Import\Errors.log"
-- 4. 產生格式檔 (供複雜對應使用)
bcp Sales.Orders format nul -S . -T -f "C:\Export\Orders.fmt" -c
BCP 進階技巧
- 匯出含標頭: BCP 本身不支援直接輸出標頭。解法:
bcp "SELECT 'Col1','Col2' UNION ALL SELECT Col1,Col2 FROM Tbl" queryout ... 或先匯出標頭檔再 copy /b header.csv + data.csv full.csv。
- 大檔案分割: 使用
-F 首列 -L 尾列 搭配迴圈腳本分割匯出,避免單一巨大檔案。
- 效能調優: 加
-h "TABLOCK" 取得表鎖減少鎖爭用;調大 -b 批次大小 減少交易提交開銷;使用 -N 原生模式達最高吞吐。
- 編碼陷阱:
-c 使用 ANSI 代碼頁 (預設 OEM);中文環境務必加 -C 65001 (UTF-8) 或 -w (UTF-16LE)。
方法二:DTS/SSIS 匯入匯出精靈 — 視覺化、異構資料源、一次性任務
啟動方式
- SSMS:資料庫右鍵 → 工作 → 匯出資料
- 命令列:
DTSWizard.exe
核心功能
| 功能 | 說明 |
| 資料來源/目的地 | 支援 SQL Server、Oracle、Excel、Access、Flat File、ODBC/OLE DB 任意組合 |
| 資料轉換 | 欄位對應、資料類型轉換、衍生欄位 (VBScript/JScript)、查閱、聚合 |
| 物件複製 | 可勾選複製索引、檢視、觸發程序、檢查約束、預存程序 |
| 儲存封裝 | 另存為 .dtsx (SSIS)、SQL Server (msdb)、檔案系統、Meta Data Services |
| 排程執行 | 精靈完成後可直接建立 Agent 作業定期執行 |
適用場景對比
| 維度 | BCP | DTS/SSIS 精靈 |
| 自動化/批次 | 極佳 (命令列、腳本、Agent) | 需另存封裝再排程 |
| 效能 (大量資料) | 最高 (流式、無轉換開銷) | 良好 (有 ETL 流程開銷) |
| 異構資料源 | 僅支援 SQL Server ↔ 檔案 | 支援所有 OLE DB/ODBC 來源 |
| 資料轉換/清洗 | 無 (需查詢預處理) | 豐富 (衍生欄、查閱、腳本) |
| 視覺化/易用性 | 低 (需熟參數) | 高 (精靈引導) |
| 標頭/格式控制 | 需技巧處理 | 內建選項 |
選擇建議
- 定期自動化、同質 SQL Server、追求極致效能: BCP (或
BULK INSERT/OPENROWSET)
- 一次性遷移、異構來源、需轉換清洗、非技術人員操作: SSIS 精靈
- 企業級 ETL 平台: 完整 SSIS 專案 (Visual Studio SSDT),支援版控、參數化、部署模型、事件處理、日誌記錄。
掌握兩種工具,即可應對 99% 的資料匯出入場景。
- 上一篇文章: SQL Server Agent 作業排程實戰:建立、監控、歷史記錄管理與故障排除
- 下一篇文章: SQL Server 進階查詢技巧:多表連接、子查詢、集合運算與 TOP 分頁完全指南
Copyright ©
程式碼之家 All Rights Reserved