需求:在 T-SQL 中直接將任意查詢結果匯出為逗號分隔文字檔,檔名含日期戳。解決方案:封裝 bcp.exe 於系統預存程序,透過 xp_cmdshell 執行。
CREATE PROCEDURE dbo.sp_sql_query_to_file
@servername VARCHAR(50), -- 伺服器名稱
@username VARCHAR(50), -- 登入帳號 (Windows 驗證傳空字串)
@password VARCHAR(50), -- 密碼
@sql_query VARCHAR(2000), -- 查詢語句 (字串條件內層用單引號)
@filePath_name VARCHAR(1000), -- 匯出路徑與檔名主體
@date DATETIME -- 日期戳
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cmd VARCHAR(8000);
SET @cmd = 'bcp "' + @sql_query + '" queryout "' +
@filePath_name + '_' + CONVERT(VARCHAR(12), @date, 112) + '.txt" ' +
'/t "," /w ' + -- 欄位逗號分隔、Unicode 寬字元
'/S ' + @servername + ' ' +
CASE WHEN ISNULL(@username,'') = '' THEN '' ELSE '/U ' + @username + ' ' END +
'/P ' + ISNULL(@password,'');
PRINT @cmd; -- 除錯用
EXEC master..xp_cmdshell @cmd;
IF @@ERROR <> 0
PRINT '匯出失敗,錯誤碼: ' + CAST(@@ERROR AS VARCHAR);
END
EXEC dbo.sp_sql_query_to_file
@servername = 'LOCALHOST',
@username = 'sa',
@password = 'P@ssw0rd',
@sql_query = 'SELECT OrderID, OrderDate, CustomerID FROM Northwind.dbo.Orders WHERE OrderDate > ''2023-01-01''',
@filePath_name = 'D:\Export\Orders',
@date = GETDATE();
-- 產生 D:\Export\Orders_20240518.txt
| 參數 | 用途 |
|---|---|
| /t "," | 欄位終止符號為逗號 |
| /w | Unicode 寬字元模式 (支援中文、特殊字元) |
| /S | 目標伺服器 |
| /U /P | SQL 驗證帳密 (Windows 驗證用 /T 信任連線) |
| /c | 字元模式 (非 Unicode,檔案較小但不支援雙位元組字元) |