SQL Server 輸出 XML


一、概述

SELECT 查詢將結果作為行集返回。在 SQL 查詢中指定 FOR XML 子句,從而將該查詢的正式結果作為 XML 來檢索。FOR XML 子句可以用在頂級查詢和子查詢中。頂級 FOR XML 子句只能用在 SELECT 語句中。而在子查詢中,FOR XML 可以用在 INSERT、UPDATE 和 DELETE 語句中。它還可以用在賦值語句中。
  在 FOR XML 子句中,指定以下模式之一:

  • RAW
  • AUTO
  • EXPLICIT
  • PATH

二、測試數據

構建一個表:TestTable,表中數據如下:

 

 

三、示例

1、FOR XML RAW
  RAW 模式將為 SELECT 語句所返回行集中的每行生成一個 <row> 元素。 可以通過編寫嵌套 FOR XML 查詢來生成 XML 層次結構。

SQL語句:
SELECT ID, Name, Age, Sex FROM TestTable FOR XML RAW

執行結果:
<row ID="1" Name="Jim" Age="20" Sex="男" />
<row ID="2" Name="Tina" Age="23" Sex="女" />

2、FOR XML AUTO
  AUTO 模式將基於指定 SELECT 語句的方式來使用試探性方法在 XML 結果中生成嵌套。 您對生成的 XML 的形狀具有最低限度的控制能力。 除了 AUTO 模式的試探性方法生成的 XML 形狀之外,還可以編寫 FOR XML 查詢來生成 XML 層次結構。

SQL語句:
SELECT ID, Name, Age, Sex FROM TestTable FOR XML AUTO

執行結果:
<TestTable ID="1" Name="Jim" Age="20" Sex="男" />
<TestTable ID="2" Name="Tina" Age="23" Sex="女" />

注:這種模式返回的XML結構是不可控的,用SQL示例數據庫示范如下:

SQL語句:
USE AdventureWorks2012
GO
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;

執行結果:
<Cust CustomerID="29825">
<OrderHeader CustomerID="29825" SalesOrderID="43659" Status="5" />
</Cust>
<Cust CustomerID="29672">
<OrderHeader CustomerID="29672" SalesOrderID="43660" Status="5" />
</Cust>

稍微改變下SELECT的字段順序,結果就會發生變化;
SQL語句:
USE AdventureWorks2012
GO
SELECT OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerID
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;

執行結果:
<OrderHeader CustomerID="29825" SalesOrderID="43659" Status="5">
<Cust CustomerID="29825" />
</OrderHeader>
<OrderHeader CustomerID="29672" SalesOrderID="43660" Status="5">
<Cust CustomerID="29672" />
</OrderHeader>

3、FOR XML EXPLICIT
  EXPLICIT 模式允許對 XML 的形狀進行更多控制。 您可以隨意混合屬性和元素來確定 XML 的形狀。 由於執行查詢而生成的結果行集需要具有特定的格式。 此行集格式隨后將映射為 XML 形狀。 使用 EXPLICIT 模式能夠隨意混合屬性和元素、創建包裝和嵌套的復雜屬性、創建用空格分隔的值(例如 OrderID 屬性可能具有一列排序順序 ID 值)以及混合內容。
  但是,編寫 EXPLICIT 模式的查詢會比較麻煩。 可以使用某些新的 FOR XML 功能(例如編寫嵌套 FOR XML RAW/AUTO/PATH 模式查詢和 TYPE 指令),而不使用 EXPLICIT 模式來生成層次結構。 嵌套 FOR XML 查詢可以生成使用 EXPLICIT 模式可生成的任何 XML。 有關詳細信息,請參閱使用嵌套 FOR XML 查詢和 FOR XML 查詢中的 TYPE 指令。

4、FOR XML PATH
  PATH 模式與嵌套 FOR XML 查詢功能一起以較簡單的方式提供了 EXPLICIT 模式的靈活性。

SQL語句:
SELECT ID, Name, Age, Sex FROM TestTable FOR XML PATH('Info')

執行結果:
<Info>
<ID>1</ID>
<Name>Jim</Name>
<Age>20</Age>
<Sex>男</Sex>
</Info>
<Info>
<ID>2</ID>
<Name>Tina</Name>
<Age>23</Age>
<Sex>女</Sex>
</Info>

將ID作為屬性;
SQL語句:
SELECT ID as '@ID', Name, Age, Sex FROM TestTable FOR XML PATH('Info')

執行結果:
<Info ID="1">
<Name>Jim</Name>
<Age>20</Age>
<Sex>男</Sex>
</Info>
<Info ID="2">
<Name>Tina</Name>
<Age>23</Age>
<Sex>女</Sex>
</Info>

四、ELEMENTS
  ELEMENTS指定列作為子元素返回,即 ELEMENTS 選項指定 XML 結果是以元素為中心的。否則,列將映射到 XML 屬性。只在 RAW、AUTO 和 PATH 模式中支持該選項。

SQL語句:
USE AdventureWorks2012
GO
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO,ELEMENTS

執行結果:
<Cust>
<CustomerID>29825</CustomerID>
<OrderHeader>
<CustomerID>29825</CustomerID>
<SalesOrderID>43659</SalesOrderID>
<Status>5</Status>
</OrderHeader>
</Cust>
<Cust>
<CustomerID>29672</CustomerID>
<OrderHeader>
<CustomerID>29672</CustomerID>
<SalesOrderID>43660</SalesOrderID>
<Status>5</Status>
</OrderHeader>
</Cust>

五、FOR XML查詢中的TYPE指令

SQL Server 將 XML 數據類型實例數據作為不同服務器構造(如使用 TYPE 指令的 FOR XML 查詢,或在其中使用 xml 數據類型返回 SQL 表列和輸出參數中的 XML 實例數據值的 FOR XML 查詢)的結果返回到客戶端。 在客戶端應用程序代碼中,ADO.NET 提供程序請求從服務器以二進制編碼發送此 XML 數據類型信息。 但是,如果使用的是不帶 TYPE 指令的 FOR XML,則 XML 數據將以字符串類型返回。 在任何情況下,客戶端訪問接口都始終能夠處理其中任一種形式的 XML 內容。 請注意,不帶 TYPE 指令的頂級 FOR XML 不能與游標一起使用。
如果未指定 TYPE 指令,則返回的 FOR XML 查詢結果的類型為 nvarchar(max) 。

SELECT ID, Name, Age, Sex FROM TestTable FOR XML AUTO, TYPE


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM