共用方式為


巢狀 FOR XML 查詢

在 SQL Server 2000 中,您只能在 SELECT 查詢的最上層指定 FOR XML 子句。產生的 XML 主要會傳回給用戶端以進行其他處理。但是從 SQL Server 2005 開始,xml 資料類型和 FOR XML 查詢中的 TYPE 指示詞可讓 FOR XML 查詢傳回的 XML 額外在伺服器上進行處理。

處理 xml 類型變數

您可以將 FOR XML 查詢結果指派給 xml 類型變數,或是使用 XQuery 以查詢結果,然後將該結果指派給 xml 類型變數以進行其他處理。

USE AdventureWorks2008R2;
GO
DECLARE @x xml;
SET @x=(SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID=122 OR ProductModelID=119
        FOR XML RAW, TYPE);
SELECT @x;

-- Result

--<row ProductModelID="122" Name="All-Purpose Bike Stand" />

--<row ProductModelID="119" Name="Bike Wash" />

使用其中一種 xml 資料類型方法,您就可以再額外處理以變數 @x 傳回的 XML。例如,您可以使用 value() 方法來擷取 ProductModelID 屬性值。

DECLARE @i int;
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));
SELECT @i;

在下列範例中,因為已在 FOR XML 子句中指定 TYPE 指示詞,所以傳回的 FOR XML 查詢結果為 xml 類型。

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 OR ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot');

結果如下:

<myRoot>

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

<row ProductModelID="119" Name="Bike Wash" />

</myRoot>

因為結果為 xml 類型,所以您可以直接對此 XML 指定其中一個 xml 資料類型方法,如以下查詢所示。在查詢中,會使用 query() 方法 (XML 資料類型) 來擷取 <myRoot> 元素的第一個 <row> 元素子項。

SELECT  (SELECT ProductModelID, Name
         FROM Production.ProductModel
         WHERE ProductModelID=119 OR ProductModelID=122
         FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');

結果如下:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

將內部 FOR XML 查詢結果當做 xml 類型執行個體傳回給外部查詢

您可以撰寫巢狀 FOR XML 查詢,其中的內部查詢結果會以 xml 類型傳回給外部查詢。例如:

SELECT Col1, 
       Col2, 
       ( SELECT Col3, Col4 
        FROM  T2
        WHERE T2.Col = T1.Col
        ...
        FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;

下列為上一個查詢的注意事項:

  • 以內部 FOR XML 查詢產生的 XML 會加入至外部 FOR XML 產生的 XML 中。

  • 內部查詢會指定 TYPE 指示詞。因此,內部查詢所傳回的 XML 資料為 xml 類型。如果未指定 TYPE 指示詞,會以 nvarchar(max) 傳回內部 FOR XML 查詢的結果,並實體化 XML 資料。

控制產生之 XML 資料的外觀

巢狀 FOR XML 查詢可讓您有更多的控制權,以定義所產生之 XML 資料的外觀。在 SQL Server 2000 中,RAW 和 AUTO 模式查詢預設會產生屬性中心的 XML。例如:

USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW;

屬性中心結果如下:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

<row ProductModelID="119" Name="Bike Wash" />

或者,您可以藉由指定 ELEMENTS 指示詞,以元素中心方式擷取所有的 XML。例如:

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS ;

元素中心結果如下:

<row>

<ProductModelID>122</ProductModelID>

<Name>All-Purpose Bike Stand</Name>

</row>

<row>

<ProductModelID>119</ProductModelID>

<Name>Bike Wash</Name>

</row>

因此在 SQL Server 2000 中,您必須選擇屬性中心或元素中心的 XML 當做查詢的結果。但是從 SQL Server 2005 開始,您可以使用 FOR XML 查詢來建構部分為屬性中心、部分為元素中心的 XML。

如需有關使用巢狀 FOR XML 查詢同時指定屬性中心和元素中心 XML 的詳細資訊,請參閱<與巢狀 FOR XML 查詢比較的 FOR XML 查詢>和<使用巢狀 FOR XML 查詢形成 XML>。

在 SQL Server 2000 中,您只能使用 EXPLICIT 模式撰寫查詢以建構同層級。但是,這可能會相當繁雜。從 SQL Server 2005 開始,您可以指定巢狀 AUTO 模式 FOR XML 查詢來產生含有同層級的 XML 階層。如需詳細資訊,請參閱<使用巢狀 AUTO 模式查詢產生同層級>。

不論您使用的模式為何,巢狀 FOR XML 查詢都能提供更多的控制權以描述所產生 XML 的形狀。它們可用來取代 EXPLICIT 模式查詢。

範例

下列主題將提供巢狀 FOR XML 查詢的範例。