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

SQL Server 2005 FOR XML 進階應用:TYPE 指令、巢狀查詢、命名空間與 PATH 模式完整教學

     編輯:關於SqlServer

SQL Server 2005 大幅增強 FOR XML 功能,引入 TYPE 指令回傳 XML 型別、支援巢狀 FOR XML 子查詢、WITH XMLNAMESPACES 宣告命名空間,以及更直覺的 PATH 模式。本文以 AdventureWorks 範例資料庫為基礎,完整示範這四大核心功能的語法與輸出差異。

一、TYPE 指令:回傳 XML 型別而非字串

無 TYPE (回傳 NVARCHAR)

DECLARE @Str NVARCHAR(1024);
SET @Str = (SELECT ProductID, Name FROM Production.Product 
            WHERE ProductSubcategoryID = 9 FOR XML AUTO);
SELECT @Str;  -- 純文字,SSMS 無法點擊展開 XML 視圖

有 TYPE (回傳 XML 型別)

DECLARE @Xml XML;
SET @Xml = (SELECT ProductID, Name FROM Production.Product 
            WHERE ProductSubcategoryID = 9 FOR XML AUTO, TYPE);
SELECT @Xml;  -- SSMS 可點擊展開結構化 XML

⚠️ 變數型別必須宣告為 XML,否則隱含轉換會報錯。

二、巢狀 FOR 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:命名空間宣告

指定前綴

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

四、FOR XML PATH 模式:靈活控制元素/屬性路徑

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 模式簡單得多。

應用層整合優勢

  • ADO.NET:SqlCommand.ExecuteXmlReader() 直接讀取 XmlReader,無需字串解析。
  • BizTalk / SQL Adapter:存儲程序回傳 XML 型別可直接對應 Schema,減少對應複雜度。
  • Web Service:WCF/Web API 直接序列化 XElement/XmlDocument 回傳。

版本演進提醒

版本關鍵功能
SQL 2000FOR XML RAW/AUTO/EXPLICIT,僅回傳文字
SQL 2005TYPE、巢狀 FOR XML、XMLNAMESPACES、PATH 模式、XML 型別
SQL 2008+增強效能、支援 XML 索引、XQuery/XPath 修改
SQL 2016+FOR JSON、OPENJSON、JSON_MODIFY,雙格式並行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved