在 SQL Server 環境中,將資料庫查詢結果匯出為文字檔(如 CSV、TXT)是常見的資料交換需求。其中最經典且效能優異的方式,莫過於搭配 xp_cmdshell 執行 bcp (Bulk Copy Program) 指令。本文將詳細說明從啟用權限、指令語法解析,到實際匯出範例的完整流程。
xp_cmdshell 為擴展預存程序,允許在 T-SQL 中執行作業系統命令。預設關閉,需透過以下兩種方式啟用:
EXEC master.dbo.sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC master.dbo.sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
開啟 SQL Server 組態管理工具,選擇「功能的表面積設定」,勾選 Enable xp_cmdshell 核取方塊即可。

圖一:表面積設定介面
啟用完成後,即可在查詢視窗執行 BCP 指令。以下範例將系統資料表 sysfiles 的內容,以逗號分隔 (CSV) 格式匯出至 C:\bcptest.txt:
EXEC xp_cmdshell 'bcp "SELECT * FROM sysfiles" queryout "C:\bcptest.txt" -T -c -t,';
注意: BCP 為命令列工具,xp_cmdshell 僅能在單一 SQL 批次中呼叫。
| 參數 | 用途 |
|---|---|
queryout | 指定輸出來源為查詢語句,支援任意複雜度的 SELECT,亦可搭配 View 使用。 |
檔案路徑 | 緊接在 queryout 之後,定義輸出檔案完整路徑。 |
-T | 使用信任連線 (Windows 整合驗證) 連接 SQL Server。若需 SQL 驗證,改用 -U (帳號) 與 -P (密碼)。 |
-c | 以字元資料類型處理每個欄位 (預設為原生格式),適合文字檔匯出。 |
-t, | 指定欄位分隔符號,此處為逗號 ,。若省略,預設為 Tab (\t)。 |
在 master 資料庫執行上述指令,訊息頁籤將顯示匯出進度與筆數:

圖二:匯出成功訊息
若目標非本機預設執行個體,需加入 -S 參數指定伺服器名稱\執行個體名稱:
EXEC xp_cmdshell 'bcp "select name, type_desc, create_date from sys.objects" queryout "C:\bcptest2.txt" -T -S DEVELOP\DEV1 -c -t,';
關鍵提醒: -t (分隔符) 與 -T (信任連線) 大小寫意義截然不同,請務必確認大小寫正確,避免連線失敗或格式錯誤。
透過 xp_cmdshell + bcp 組合,可高效完成大量資料的文字檔匯出,且支援彈性的查詢來源、分隔符號與驗證模式。實務上建議搭配預存程序或 SQL Agent Job 自動化排程,滿足定期匯出需求。