SQL Server 2005 大幅增強 FOR XML 功能,引入 TYPE 指令回傳 XML 型別、支援巢狀 FOR XML 子查詢、WITH XMLNAMESPACES 宣告命名空間,以及更直覺的 PATH 模式。本文以 AdventureWorks 範例資料庫為基礎,完整示範這四大核心功能的語法與輸出差異。
DECLARE @Str NVARCHAR(1024);
SET @Str = (SELECT ProductID, Name FROM Production.Product
WHERE ProductSubcategoryID = 9 FOR XML AUTO);
SELECT @Str; -- 純文字,SSMS 無法點擊展開 XML 視圖
DECLARE @Xml XML;
SET @Xml = (SELECT ProductID, Name FROM Production.Product
WHERE ProductSubcategoryID = 9 FOR XML AUTO, TYPE);
SELECT @Xml; -- SSMS 可點擊展開結構化 XML
⚠️ 變數型別必須宣告為 XML,否則隱含轉換會報錯。
SELECT
PSC.ProductSubcategoryID,
PSC.Name,
(SELECT ProductID, Name
FROM Production.Product P
WHERE P.ProductSubcategoryID = PSC.ProductSubcategoryID
FOR XML AUTO, TYPE) AS Products
FROM Production.ProductSubcategory PSC
WHERE PSC.ProductSubcategoryID = 9
FOR XML AUTO;
<PSC ProductSubcategoryID="9" Name="Mountain Bikes">
<Products>
<P ProductID="771" Name="Mountain-100 Silver, 38" />
<P ProductID="772" Name="Mountain-100 Silver, 42" />
...
</Products>
</PSC>
若子查詢缺少 TYPE,子層級會以字串逸出 (Entity Encoded) 形式輸出,破壞 XML 結構。
WITH XMLNAMESPACES ('uri0' AS ns0)
SELECT
PSC.ProductSubcategoryID, PSC.Name,
(SELECT ProductID, Name FROM Production.Product P
WHERE P.ProductSubcategoryID = 9
FOR XML RAW('ns0:Product'), TYPE) AS 'ns0:Products'
FROM Production.ProductSubcategory PSC
WHERE PSC.ProductSubcategoryID = 9
FOR XML RAW('ns0:Category'), ROOT('ns0:Message');
WITH XMLNAMESPACES (DEFAULT 'https://blog.csdn.net/zhzuo')
SELECT
PSC.ProductSubcategoryID, PSC.Name,
(SELECT ProductID, Name FROM Production.Product P
WHERE P.ProductSubcategoryID = 9
FOR XML AUTO, TYPE) AS Products
FROM Production.ProductSubcategory PSC
WHERE PSC.ProductSubcategoryID = 9
FOR XML AUTO, ROOT('Message');
WITH XMLNAMESPACES (DEFAULT 'https://blog.csdn.net/zhzuo')
SELECT
ProductID AS 'Product/@ProductID',
Name AS 'Product/Name'
FROM Production.Product
WHERE ProductSubcategoryID = 9
FOR XML PATH(''), ROOT('Products');
<Products xmlns="https://blog.csdn.net/zhzuo">
<Product ProductID="771"><Name>Mountain-100 Silver, 38</Name></Product>
<Product ProductID="772"><Name>Mountain-100 Silver, 42</Name></Product>
...
</Products>
PATH('') 移除預設列元素,配合別名路徑語法 (@ 表屬性、/ 表子元素) 可精確建構任意結構,比 EXPLICIT 模式簡單得多。
SqlCommand.ExecuteXmlReader() 直接讀取 XmlReader,無需字串解析。XML 型別可直接對應 Schema,減少對應複雜度。XElement/XmlDocument 回傳。| 版本 | 關鍵功能 |
|---|---|
| SQL 2000 | FOR XML RAW/AUTO/EXPLICIT,僅回傳文字 |
| SQL 2005 | TYPE、巢狀 FOR XML、XMLNAMESPACES、PATH 模式、XML 型別 |
| SQL 2008+ | 增強效能、支援 XML 索引、XQuery/XPath 修改 |
| SQL 2016+ | FOR JSON、OPENJSON、JSON_MODIFY,雙格式並行 |