首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 資料匯出為 XML 與 JSON 完整指南:BCP、FOR XML、自訂預存程序

     編輯:關於SqlServer

為什麼不直接用 SSIS / 匯入匯出精靈?

  • SSIS 套件開發、部署、維護成本高,一次性匯出「殺雞用牛刀」。
  • 匯入匯出精靈 Bug 多、介面操作慢、難以自動化腳本化。
  • BCP (Bulk Copy Program):命令列工具、極速、支援腳本自動化、無額外元件。

一、匯出為 XML

1. T-SQL:FOR XML 子句 (SQL Server 2005+ 原生支援)

-- 基本語法
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
  
  ...

2. BCP 命令列匯出 XML 檔案

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/-PSQL 驗證時指定帳號密碼
-wUnicode 模式 (解決中文亂碼,見下文)

BCP 匯出 XML 命令執行畫面

產生的 XML 檔案內容

3. 常見問題:中文亂碼

將 -c 改為 -w (Unicode 模式) 即可解決:

BCP "..." QUERYOUT "D:\Temp\Test.XML" -w -T -S localhost

二、匯出為 JSON

SQL Server 2016 以前**無原生 JSON 匯出**,2016+ 支援 FOR JSON。本文提供 2016 前版本通用方案:自訂預存程序 + BCP。

方案:建立通用 JSON 轉換預存程序 (參考 Jamin Quimby 作法)

-- 簡化版核心邏輯:利用 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 呼叫預存程序匯出 JSON

BCP "EXEC util_ConvertQueryToJSON @Query='SELECT TOP 10 * FROM dbo.Products'" QUERYOUT "D:\Temp\Products.JSON" -w -T -S localhost

BCP 匯出 JSON 命令

產生的 JSON 檔案

三、SQL Server 2016+ 原生 FOR JSON (強烈建議升級後使用)

-- 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');

輸出範例 (PATH):

{
  "Products": [
    { "Product": { "Id": 1, "Name": "Handlebar", "Color": "Black" } },
    { "Product": { "Id": 2, "Name": "Chain", "Color": "Silver" } }
  ]
}

四、BCP 進階技巧總結

需求解決方案
指定編碼 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 完整指令

總結

  • XML 匯出:FOR XML PATH/TYPE/ELEMENTS/ROOT + BCP QUERYOUT -w,全版本通用、標準化。
  • JSON 匯出:
    • SQL 2016+:直接用 FOR JSON AUTO/PATH + BCP,最簡單、效能最好。
    • SQL 2014 及以前:部署自訂預存程序轉換 + BCP,一次設定、長期受用。
  • BCP 是**最輕量、最高效、最易自動化**的匯出利器,DBA 必備技能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved