다음을 통해 공유


중첩 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 문은 ProductID 특성과 두 개의 <>Price자식 요소가 있는 요소를 생성 <Product> 합니다.

  • 두 개의 내부 SELECT 문은 각각 PriceType 특성과 제품 가격을 반환하는 XML을 사용하여 두 <Price> 요소를 구성합니다.

  • 바깥쪽 SELECT문의 XMLSCHEMA 지시문은 결과 XML의 형태를 설명하는 인라인 XSD 스키마를 생성합니다.

쿼리를 흥미롭게 만들려면 다음 쿼리와 같이 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  

이전 예제에서는 데이터 형식의 xml 메서드를 사용하여 query() 내부 FOR XML 쿼리에서 반환된 XML을 쿼리하고 예상된 결과를 생성합니다.

다음은 결과입니다.

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

또한 참조하십시오

FOR XML 중첩 쿼리 사용