중첩 FOR XML 쿼리로 XML 구체화Shape XML with Nested FOR XML Queries

다음 예에서는 Production.Product 테이블을 쿼리하여 특정 제품의 ListPriceStandardCost 값을 검색합니다.The following example queries the Production.Product table to retrieve the ListPrice and StandardCost values of a specific product. 쿼리를 효과적으로 만들기 위해 두 가격이 모두 <Price> 요소에 반환되고 각 <Price> 요소에는 PriceType 특성이 포함됩니다.To make the query interesting, both prices are returned in a <Price> element, and each <Price> element has a PriceType attribute.

예제Example

다음은 XML의 예상 셰이프입니다.This is the expected shape of the XML:

<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" elementFormDefault="qualified">  
  <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://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 쿼리입니다.This is the nested FOR XML query:

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  

이전 쿼리에서 다음을 유의하세요.Note the following from the previous query:

  • 외부 SELECT 문은 ProductID 특성과 두 개의 <Price> 자식 요소가 있는 <Product> 요소를 생성합니다.The outer SELECT statement constructs the <Product> element that has a ProductID attribute and two <Price> child elements.

  • 두 개의 내부 SELECT 문은 각각 PriceType 특성과 제품 가격을 반환하는 XML이 포함된 두 개의 <Price> 요소를 생성합니다.The two inner SELECT statements construct two <Price> elements, each with a PriceType attribute and XML that returns the product price.

  • 외부 SELECT 문에 있는 XMLSCHEMA 지시어는 결과 XML의 셰이프를 기술하는 인라인 XSD 스키마를 생성합니다.The XMLSCHEMA directive in the outer SELECT statement generates the inline XSD schema that describes the shape of the resulting XML.

    쿼리를 효과적으로 만들기 위해 FOR XML 쿼리를 작성한 다음 결과에 대해 XQuery를 작성하여 다음 쿼리에서와 같이 XML 셰이프를 다시 지정할 수 있습니다.To make the query interesting, you can write the FOR XML query and then write an XQuery against the result to reshape the XML, as shown in the following query:

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  

이전 예에서는 xml 데이터 형식의 query() 메서드를 사용하여 내부 FOR XML 쿼리에 의해 반환된 XML을 쿼리하고 예상된 결과를 생성합니다.The previous example uses the query() method of the xml data type to query the XML returned by the inner FOR XML query and construct the expected result.

다음은 결과입니다.This is the result:

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

참고 항목See Also

중첩 FOR XML 쿼리 사용Use Nested FOR XML Queries