共用方式為


使用巢狀 FOR XML 查詢來構成 XML

以下範例會查詢 Production.Product 資料表,以擷取特定產品的 ListPriceStandardCost 值。 為了讓查詢變得有趣,這兩個價格都會在<Price>元素中傳回,而每個<Price>元素都有一個PriceType屬性。

範例

以下是預期的 XML 外觀:

<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" elementFormDefault="qualified">  
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />  
  <xsd:element name="Production.Product" type="xsd:anyType" />  
</xsd:schema>  
<Production.Product xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2" ProductID="520">  
  <Price xmlns="" PriceType="ListPrice">133.34</Price>  
  <Price xmlns="" PriceType="StandardCost">98.77</Price>  
</Production.Product>  

以下是巢狀 FOR XML 查詢:

USE AdventureWorks2012;  
GO  
SELECT Product.ProductID,   
          (SELECT 'ListPrice' as PriceType,   
                   CAST(CAST(ListPrice as NVARCHAR(40)) as XML)   
           FROM    Production.Product Price   
           WHERE   Price.ProductID=Product.ProductID   
           FOR XML AUTO, TYPE),  
          (SELECT  'StandardCost' as PriceType,   
                   CAST(CAST(StandardCost as NVARCHAR(40)) as XML)   
           FROM    Production.Product Price   
           WHERE   Price.ProductID=Product.ProductID   
           FOR XML AUTO, TYPE)  
FROM Production.Product  
WHERE ProductID=520  
for XML AUTO, TYPE, XMLSCHEMA  

請注意下列項目是從上一個查詢而來:

  • 外部 SELECT 陳述式構造<Product>元素,其中包含元素所具有的 ProductID屬性及兩個<Price>子元件。

  • 兩個內部 SELECT 語句會建構兩 <Price> 個元素,每個元素都有 PriceType 屬性和會傳回產品價格的 XML。

  • 外部 SELECT 陳述式中的 XMLSCHEMA 指示詞會產生內嵌的 XSD 結構描述,描述產生之 XML 的外觀。

您可以撰寫 FOR XML 查詢,然後對結果撰寫 XQuery 以重新塑造 XML,使查詢更有趣,如以下查詢所示:

SELECT ProductID,   
 ( SELECT p2.ListPrice, p2.StandardCost  
   FROM Production.Product p2   
   WHERE Product.ProductID = p2.ProductID  
   FOR XML AUTO, ELEMENTS XSINIL, type ).query('  
                                   for $p in /p2/*  
                                   return   
                                    <Price PriceType = "{local-name($p)}">  
                                     { data($p) }  
                                    </Price>  
                                  ')  
FROM Production.Product  
WHERE ProductID = 520  
FOR XML AUTO, TYPE  

上述範例會使用 query() 數據類型的 xml 方法來查詢內部 FOR XML 查詢所傳回的 XML,並建構預期的結果。

以下是結果:

<Production.Product ProductID="520">  
  <Price PriceType="ListPrice">133.3400</Price>  
  <Price PriceType="StandardCost">98.7700</Price>  
</Production.Product>  

另請參閱

使用巢狀 FOR XML 查詢