SQL Server 透過 FOR XML 子句將查詢結果直接序列化為 XML,支援 RAW、AUTO、EXPLICIT、PATH 四種模式,滿足從簡單屬性導出到複雜巢狀結構的各類需求。
| 模式 | 特性 | 適用場景 |
|---|---|---|
| RAW | 每列產生 <row .../> 元素,欄位對應屬性 | 簡單平面 XML、快速匯出、Web Service 回傳 |
| AUTO | 依 JOIN 關係自動產生巢狀元素,資料表名為元素名 | 主從結構 (訂單-明細)、快速產生階層 XML |
| EXPLICIT | 完全控制結構,需在 SELECT 中指定 Tag/Parent/欄位屬性 | 高度客製化 XML 結構、符合特定 XSD |
| PATH | 以欄位別名路徑定義元素/屬性 (如 @Attr, Element/Sub) | 介於 AUTO 與 EXPLICIT 間,直觀易維護 (2005+) |
SET ROWCOUNT 3;
SELECT OrderID, OrderDate, ProductID
FROM Orders JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID
ORDER BY OrderID
FOR XML RAW;
輸出:
SELECT OrderID, OrderDate, ProductID
FROM Orders JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID
ORDER BY OrderID
FOR XML AUTO;
輸出:
SELECT
OrderID AS '@OrderID',
OrderDate AS '@OrderDate',
(SELECT ProductID AS '@ProductID'
FROM [Order Details] od WHERE od.OrderID = o.OrderID
FOR XML PATH('OrderDetail'), TYPE) AS OrderDetails
FROM Orders o
WHERE OrderID = 10248
FOR XML PATH('Order'), ROOT('Orders');
輸出:
ELEMENTS:強制產生子元素而非屬性 (RAW/AUTO/PATH 皆適用)。XMLDATA / XMLSCHEMA:附加 XDR/XSD 結構描述。BINARY BASE64:二進位欄位以 Base64 編碼。ROOT('RootName'):包裝單一根元素。TYPE:回傳 xml 型別而非 nvarchar(max),可直接鏈式處理。FOR XML 將關聯資料無縫轉換為 XML,PATH 模式以直觀路徑語法取代複雜的 EXPLICIT,成為主流選擇。善用 TYPE 導向 xml 型別,配合 XQuery/XPath 進一步處理,構建完整關聯-XML 橋樑。