다음을 통해 공유


중첩된 AUTO 모드 쿼리를 사용하여 형제 생성

다음 예에서는 중첩된 AUTO 모드 쿼리를 사용하여 형제를 생성하는 방법을 보여 줍니다. 이러한 XML을 생성하는 다른 방법은 EXPLICIT 모드를 사용하는 것 뿐입니다. 그러나 이 작업은 번거로울 수 있습니다.

예시

이 쿼리는 판매 주문 정보를 제공하는 XML을 생성합니다. 여기에는 다음과 같은 사항이 포함됩니다.

  • 판매 주문 헤더 정보, SalesOrderID, SalesPersonIDOrderDate가 포함됩니다. AdventureWorks2012SalesOrderHeader 이 정보를 테이블에 저장합니다.

  • 판매 주문 세부 정보. 여기에는 주문된 하나 이상의 제품, 단가 및 주문된 수량이 포함됩니다. 이 정보는 SalesOrderDetail 테이블에 저장됩니다.

  • 판매 개인 정보. 이것은 주문을 받은 영업 직원입니다. SalesPerson 테이블은 SalesPersonID를 제공합니다. 이 쿼리에서는 판매 직원 이름을 찾기 위해 이 테이블을 Employee 테이블에 조인해야 합니다.

고유한 SELECT 쿼리 두 개가 모양에 약간의 차이가 있는 XML을 생성합니다.

첫 번째 쿼리는 <SalesOrder>의 형제 자식으로 나타나는 XML을 생성하며, 그 안에 <SalesPerson>와 <SalesOrderHeader>가 포함됩니다.

SELECT   
      (SELECT top 2 SalesOrderID, SalesPersonID, CustomerID,  
         (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice  
           from Sales.SalesOrderDetail  
            WHERE  SalesOrderDetail.SalesOrderID =   
                   SalesOrderHeader.SalesOrderID  
            FOR XML AUTO, TYPE)  
        FROM  Sales.SalesOrderHeader  
        WHERE SalesOrderHeader.SalesOrderID = SalesOrder.SalesOrderID  
        for xml auto, type),  
        (SELECT *   
         FROM  (SELECT SalesPersonID, EmployeeID  
              FROM Sales.SalesPerson, HumanResources.Employee  
              WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As   
                     SalesPerson  
         WHERE  SalesPerson.SalesPersonID = SalesOrder.SalesPersonID  
       FOR XML AUTO, TYPE)  
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID  
      FROM Sales.SalesOrderHeader, Sales.SalesPerson  
      WHERE SalesOrderHeader.SalesPersonID = SalesPerson.SalesPersonID  
     ) as SalesOrder  
ORDER BY SalesOrder.SalesOrderID  
FOR XML AUTO, TYPE  

이전 쿼리에서 가장 바깥쪽 SELECT 문은 다음을 수행합니다.

  • SalesOrder 절에 지정된 FROM 행 집합을 쿼리합니다. 결과는 하나 이상의 <SalesOrder> 요소가 있는 XML입니다.

  • AUTO 모드 및 TYPE 지시어를 지정합니다. AUTO 모드는 쿼리 결과를 XML로 변환하고 지시문은 TYPE 결과를 형식으로 xml 반환합니다.

  • 쉼표로 구분된 두 개의 중첩 SELECT 문을 포함합니다. 첫 번째 중첩된 SELECT 는 판매 주문 정보, 헤더 및 세부 정보를 검색하고 두 번째 중첩된 SELECT 문은 판매 직원 정보를 검색합니다.

    • SELECT, SalesOrderIDSalesPersonID를 검색하는 CustomerID 문에는 판매 주문 세부 정보 정보를 반환하는 또 다른 중첩 SELECT ... FOR XML 문(AUTO 모드 및 TYPE 지시문 포함)이 포함됩니다.

영업 사원 정보를 검색하는 SELECT 문은 SalesPerson 절에서 만든 FROM 행 집합을 쿼리합니다. FOR XML 쿼리가 작동하려면 FROM 절에서 생성된 익명 행 집합에 이름을 제공해야 합니다. 이 경우, 제공된 이름은 SalesPerson입니다.

다음은 결과의 일부입니다.

<SalesOrder>  
  <Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">  
    <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />  
    <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />  
    <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />  
  </Sales.SalesOrderHeader>  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</SalesOrder>  
...  

다음 쿼리는 동일한 판매 주문 정보를 생성하지만, 결과 XML에서 <SalesPerson>가 <SalesOrderDetail>의 형제로 나타납니다.

<SalesOrder>  
    <SalesOrderHeader ...>  
          <SalesOrderDetail .../>  
          <SalesOrderDetail .../>  
          ...  
          <SalesPerson .../>  
    </SalesOrderHeader>  
  
</SalesOrder>  
<SalesOrder>  
  ...  
</SalesOrder>  

다음은 쿼리입니다.

SELECT SalesOrderID, SalesPersonID, CustomerID,  
             (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice  
              from Sales.SalesOrderDetail  
              WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID  
              FOR XML AUTO, TYPE),  
              (SELECT *   
               FROM  (SELECT SalesPersonID, EmployeeID  
                    FROM Sales.SalesPerson, HumanResources.Employee  
                    WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson  
               WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID  
         FOR XML AUTO, TYPE)  
FROM Sales.SalesOrderHeader  
WHERE SalesOrderID=43659 or SalesOrderID=43660  
FOR XML AUTO, TYPE  

다음은 결과입니다.

<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">  
  <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />  
  <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />  
  <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</Sales.SalesOrderHeader>  
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="117">  
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />  
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</Sales.SalesOrderHeader>  

지시문은 TYPE 쿼리 결과를 형식으로 xml 반환하므로 다양한 xml 데이터 형식 메서드를 사용하여 결과 XML을 쿼리할 수 있습니다. 자세한 내용은 xml 데이터 형식 메서드를 참조하세요. 다음 쿼리에서 다음에 유의하세요.

  • 이전 쿼리가 FROM 절에 추가됩니다. 쿼리 결과는 테이블로 반환됩니다. 추가된 XmlCol 별칭을 확인합니다.

  • SELECT 절은 XmlCol 절에서 반환된 XQuery를 FROM에 대해 지정합니다. query() 데이터 형식의 xml 메서드는 XQuery를 지정하는 데 사용됩니다. 자세한 내용은 query() 메서드 (xml Data Type)를 참조하세요.

    SELECT XmlCol.query('<Root> { /* } </Root>')  
    FROM (  
    SELECT SalesOrderID, SalesPersonID, CustomerID,  
                 (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice  
                  from Sales.SalesOrderDetail  
                  WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID  
                  FOR XML AUTO, TYPE),  
                  (SELECT *   
                   FROM  (SELECT SalesPersonID, EmployeeID  
                        FROM Sales.SalesPerson, HumanResources.Employee  
                        WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson  
                   WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID  
             FOR XML AUTO, TYPE)  
    FROM Sales.SalesOrderHeader  
    WHERE SalesOrderID='43659' or SalesOrderID='43660'  
    FOR XML AUTO, TYPE ) as T(XmlCol)  
    

또한 참조하십시오

FOR XML 중첩 쿼리 사용