使用 FOR XML 建構 XML

SELECT 查詢會將結果以資料列集的形式傳回。在查詢中指定 FOR XML 子句,您就可選擇以 XML 格式擷取 SQL 查詢的正式結果。FOR XML 子句可以使用在最上層的查詢與子查詢中。最上層的 FOR XML 子句只能用在 SELECT 陳述式中。在子查詢中,FOR XML 可以在 INSERT、UPDATE 與 DELETE 陳述式中使用。它也可用在指派陳述式中。

在 FOR XML 子句中,您可以指定下列模式之一:

  • RAW

  • AUTO

  • EXPLICIT

  • PATH

RAW 模式會對 SELECT 陳述式傳回的資料列集中每一個資料列,產生一個 <row> 元素。您可以撰寫巢狀 FOR XML 查詢來產生 XML 階層。

AUTO 模式會使用啟發式方法 (根據 SELECT 陳述式的指定方式),在所產生的 XML 中產生巢狀結構。您對產生的 XML 之外觀只有最少的控制權。您可以撰寫巢狀的 FOR XML 查詢,以產生 AUTO 模式啟發式方法所產生之 XML 外觀以外的 XML 階層。

EXPLICIT 模式可讓您對 XML 外觀有更多的控制權。您在決定 XML 的外觀時,可依照意願混合屬性和元素。因為查詢執行的關係,產生的結果資料列集需要有特定格式。這個資料列集格式之後會對應到 XML 外觀。EXPLICIT 模式的功能是可依照意願混合屬性和元素、建立包裝函式和巢狀的複雜屬性,以及建立以空格分隔的值 (例如,OrderID 屬性可能有順序識別碼值的清單) 和混合的內容。

不過,撰寫 EXPLICIT 模式的查詢比較繁雜。您可以使用部份新的 FOR XML 功能,例如撰寫巢狀的 FOR XML RAW/AUTO/PATH 模式查詢和 TYPE 指示詞,而不要使用 EXPLICIT 模式來產生階層。巢狀的 FOR XML 查詢可以產生您使用 EXPLICIT 模式可產生的任何 XML。如需詳細資訊,請參閱<巢狀 FOR XML 查詢>與<在 FOR XML 查詢中的 TYPE 指示詞>。

若搭配使用 PATH 模式和巢狀的 FOR XML 查詢功能,則能夠以較簡易的方式提供 EXPLICIT 模式的彈性。

只有在執行設定為這些模式的查詢時,這些模式才有效。它們並不會影響任何後續查詢的結果。

COMPUTE BY 和 FOR BROWSE 子句

對於任何搭配 COMPUTE BY 或 FOR BROWSE 子句使用的選取項目而言,FOR XML 都是無效的。例如,以下查詢將會產生錯誤:

SELECT TOP 5 SalesOrderID, UnitPrice 
FROM Sales.SalesOrderDetail 
ORDER BY SalesOrderID COMPUTE SUM(UnitPrice) BY SalesOrderID
FOR XML AUTO

FOR XML 子句和伺服器名稱

當包含 FOR XML 子句的 SELECT 陳述式在查詢中指定四部分的名稱時,若在本機電腦上執行查詢,則伺服器名稱並不會隨著 XML 文件的結果傳回。但如果是在網路伺服器上執行查詢,則伺服器名稱會以四個部分的名稱形式傳回。

例如,請考量以下的查詢:

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2008R2.Person.Person
FOR XML AUTO

若 ServerName 是本機伺服器,查詢將會傳回下列結果:

<AdventureWorks2008R2.Person.Person LastName="Achong" />

若 ServerName 是網路伺服器,查詢將會傳回下列結果:

<ServerName.AdventureWorks2008R2.Person.Person LastName="Achong" />

您可以指定下列別名來避免這種模稜兩可的情況:

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2008R2.Person.Person x
FOR XML AUTO 

此查詢傳回的內容如下:

<x LastName="Achong"/>