SQL Server 提供四種 XML 模式:RAW、AUTO、EXPLICIT、PATH。本文聚焦 FOR XML AUTO,透過實例解析其巢狀邏輯、表順序敏感性、試探演算法與特殊資料型別行為。
WITH TestXml AS (
SELECT 1 AS id, N'LeeWhoeeUniversity' AS name
UNION ALL SELECT 2, N'DePaul'
UNION ALL SELECT 3, NULL
)
SELECT id, name FROM TestXml FOR XML AUTO;
結果:
<TestXml id="1" name="LeeWhoeeUniversity" />
<TestXml id="2" name="DePaul" />
<TestXml id="3" />
ELEMENTS` 則輸出子元素。NULL 值預設略過屬性 (可加 `XSINIL` 輸出 `xsi:nil="true"`)。WITH [Order] AS (
SELECT 122 AS orderid, 1 AS productid, 10 AS quantity
UNION ALL SELECT 123, 1, 100
UNION ALL SELECT 124, 2, 20
UNION ALL SELECT 125, 3, 5
),
Product AS (
SELECT 1 AS id, N'LeeWhoeeUniversity' AS name
UNION ALL SELECT 2, N'DePaul'
)
SELECT *
FROM Product, [Order]
WHERE [Order].productid = Product.id
FOR XML AUTO;
結果:
<Product id="1" name="LeeWhoeeUniversity">
<Order orderid="122" productid="1" quantity="10" />
<Order orderid="123" productid="1" quantity="100" />
</Product>
<Product id="2" name="DePaul">
<Order orderid="124" productid="2" quantity="20" />
</Product>
SQL Server 依據 結果集欄位值逐列比較 決定巢狀:
關鍵限制:ntext, text, image, xml 及 `(n)varchar(max)`, `varbinary(max)` 不參與比較,視為永遠不同 → 導致相同邏輯值被拆分為多個父元素 (見「text 型別特殊」範例)。
若 `ORDER BY` 導致相同父層鍵值的列不相鄰,試探演算法會產生重複父元素 (見原文「結果集排序對 AUTO 試探的影響」)。
最佳實務:確保父層鍵值欄位包含在 `ORDER BY` 最前段,使相同父實體的列連續出現。
ELEMENTS:輸出子元素而非屬性。BINARY BASE64:二進位資料以 Base64 編碼輸出。TYPE:回傳 `xml` 型別而非 `nvarchar(max)`,可進一步用 XQuery 處理。ROOT('RootName'):包裝單一根元素,產出完整 XML 文件。