-- 基本語法
SELECT TOP 30 BomNo, [Level]
FROM dbo.Bom
FOR XML PATH('Item'), TYPE, ELEMENTS, ROOT('RegionSales');
-- 關鍵選項說明
-- PATH('Item') : 每列包裹在 - 元素
-- TYPE : 回傳 xml 型別 (而非 nvarchar),保留型別資訊
-- ELEMENTS : 欄位輸出為子元素 (預設為屬性)
-- ROOT('RegionSales') : 最外層根元素
輸出範例:
-
BOM-001
1
-
BOM-002
2
...
BCP "SELECT TOP 30 [BomNo],[Level] FROM [sqladmin].[dbo].[Bom] FOR XML PATH('Item'), TYPE, ELEMENTS, ROOT('RegionSales')" QUERYOUT "D:\Temp\Test.XML" -c -T -S localhost
參數說明:
| 參數 | 含義 |
|---|---|
QUERYOUT | 從查詢結果匯出 (而非資料表) |
-c | 字元模式 (預設 tab 分隔,XML 單一欄位無影響) |
-T | 信任連線 (Windows 整合驗證) |
-S localhost | 目標伺服器 |
-U/-P | SQL 驗證時指定帳號密碼 |
-w | Unicode 模式 (解決中文亂碼,見下文) |


將 -c 改為 -w (Unicode 模式) 即可解決:
BCP "..." QUERYOUT "D:\Temp\Test.XML" -w -T -S localhost
SQL Server 2016 以前**無原生 JSON 匯出**,2016+ 支援 FOR JSON。本文提供 2016 前版本通用方案:自訂預存程序 + BCP。
-- 簡化版核心邏輯:利用 FOR XML PATH 產生屬性式 XML,再以 XQuery 轉 JSON
-- 完整程式碼請參考:https://jaminquimby.com/servers/95-sql/sql-2008/145-code-tsql-convert-query-to-json
CREATE PROCEDURE util_ConvertQueryToJSON
@Query NVARCHAR(MAX),
@RootName NVARCHAR(100) = 'Root',
@ItemName NVARCHAR(100) = 'Item'
AS
BEGIN
SET NOCOUNT ON;
DECLARE @XML XML;
SET @Query = @Query + ' FOR XML PATH(''' + @ItemName + '''), TYPE, ELEMENTS, ROOT(''' + @RootName + ''')';
EXEC sp_executesql @Query; -- 這裡需進一步 XQuery 轉換,完整邏輯較長,建議部署現成方案
END
BCP "EXEC util_ConvertQueryToJSON @Query='SELECT TOP 10 * FROM dbo.Products'" QUERYOUT "D:\Temp\Products.JSON" -w -T -S localhost


-- AUTO 模式:自動依 JOIN 關聯產生巢狀結構
SELECT TOP 10
P.ProductID, P.Name, P.Color,
SOD.UnitPrice, SOD.OrderQty
FROM Production.Product P
JOIN Sales.SalesOrderDetail SOD ON P.ProductID = SOD.ProductID
FOR JSON AUTO, ROOT('Products');
-- PATH 模式:完全控制結構 (類似 FOR XML PATH)
SELECT
ProductID AS 'Product.Id',
Name AS 'Product.Name',
Color AS 'Product.Color'
FROM Production.Product
FOR JSON PATH, ROOT('Products');
{
"Products": [
{ "Product": { "Id": 1, "Name": "Handlebar", "Color": "Black" } },
{ "Product": { "Id": 2, "Name": "Chain", "Color": "Silver" } }
]
}
| 需求 | 解決方案 |
|---|---|
| 指定編碼 UTF-8 (BCP 預設 UTF-16 LE) | SQL 2017+ 加 -C 65001;舊版需用 PowerShell [IO.File]::WriteAllText 轉碼 |
| 排除標頭/分隔符 | XML/JSON 單欄位無分隔符問題;-c 配合 -t 指定分隔符 |
| 大量資料分批匯出 | 查詢加 WHERE ID BETWEEN ... 迴圈執行 BCP |
| 自動化排程 | SQL Agent 作業步驟類型選 CmdExec,命令填 BCP 完整指令 |
FOR XML PATH/TYPE/ELEMENTS/ROOT + BCP QUERYOUT -w,全版本通用、標準化。FOR JSON AUTO/PATH + BCP,最簡單、效能最好。