중첩 AUTO 모드 쿼리를 사용하여 형제 생성Generate Siblings with a Nested AUTO Mode Query

다음 예에서는 중첩된 AUTO 모드 쿼리를 사용하여 형제를 생성하는 방법을 보여 줍니다.The following example shows how to generate siblings by using a nested AUTO mode query. 이러한 XML을 생성하는 다른 방법은 EXPLICIT 모드를 사용하는 것 뿐입니다.The only other way to generate such XML is to use the EXPLICIT mode. 하지만 이 방법은 복잡할 수 있습니다.However, this can be cumbersome.

예제Example

이 쿼리는 판매 주문 정보를 제공하는 XML을 생성합니다.This query constructs XML that provides sales order information. 여기에는 다음이 포함됩니다.This includes the following:

  • 판매 주문 헤더 정보, SalesOrderID, SalesPersonIDOrderDate가 포함됩니다.Sales order header information, SalesOrderID, SalesPersonID, and OrderDate. AdventureWorks2012AdventureWorks2012 에서는 이 정보를 SalesOrderHeader 테이블에 저장합니다. stores this information in the SalesOrderHeader table.

  • 판매 주문 세부 정보.Sales order detail information. 여기에는 주문된 하나 이상의 제품, 단가 및 주문 수량이 포함됩니다.This includes one or more products ordered, the unit price, and the quantity ordered. 이 정보는 SalesOrderDetail 테이블에 저장됩니다.This information is stored in the SalesOrderDetail table.

  • 판매 직원 정보.Sales person information. 주문을 접수한 판매 직원입니다.This is the salesperson who took the order. SalesPerson 테이블은 SalesPersonID를 제공합니다.The SalesPerson table provides the SalesPersonID. 이 쿼리에서는 판매 직원 이름을 찾기 위해 이 테이블을 Employee 테이블에 조인해야 합니다.For this query, you have to join this table to the Employee table to find the name of the sales person.

    다음과 같은 두 개의 고유 SELECT는 모양이 약간 다른 XML을 생성합니다.The two distinct SELECT queries that follow generate XML with a small difference in shape.

    첫 번째 쿼리는 <SalesPerson> 및 <SalesOrderHeader>가 <SalesOrder>의 자식(형제)으로 나타나는 XML을 생성합니다.The first query generates XML in which <SalesPerson> and <SalesOrderHeader> appear as sibling children of <SalesOrder>:

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 문은 다음을 수행합니다.In the previous query, the outermost SELECT statement does the following:

  • SalesOrder 절에 지정된 행 집합인 FROM를 쿼리합니다.Queries the rowset, SalesOrder, specified in the FROM clause. 결과는 하나 이상의 <SalesOrder> 요소가 있는 XML입니다.The result is an XML with one or more <SalesOrder> elements.

  • AUTO 모드 및 TYPE 지시어를 지정합니다.Specifies AUTO mode and the TYPE directive. AUTO 모드는 쿼리 결과를 XML로 변환하고 TYPE 지시어는 결과를 xml 유형으로 반환합니다.AUTO mode transforms the query result into XML, and the TYPE directive returns the result as xml type.

  • 쉼표로 구분된 두 개의 중첩된 SELECT 문을 포함합니다.Includes two nested SELECT statements separated by a comma. 첫 번째 중첩된 SELECT 는 판매 주문 정보, 헤더 및 세부 정보를 검색하고 두 번째 중첩된 SELECT 문은 판매 직원 정보를 검색합니다.The first nested SELECT retrieves sales order information, header and details, and the second nested SELECT statement retrieves salesperson information.

    • SELECT , SalesOrderIDSalesPersonID를 검색하는 CustomerID 문 자체에 판매 주문 세부 정보를 반환하는 다른 중첩된 SELECT ... FOR XML 문( AUTO 모드와 TYPE 지시어 사용)이 포함됩니다.The SELECT statement that retrieves SalesOrderID, SalesPersonID, and CustomerID itself includes another nested SELECT ... FOR XML statement (with AUTO mode and TYPE directive) that returns sales order detail information.

    판매 직원 정보를 검색하는 SELECT 문은 SalesPerson절에서 생성된 FROM 행 집합을 쿼리합니다.The SELECT statement that retrieves the sales person information queries a rowset, SalesPerson, created in the FROM clause. FOR XML 쿼리가 작동하려면 FROM 절에서 생성된 익명 행 집합에 이름을 제공해야 합니다.For FOR XML queries to work, you must provide a name for the anonymous rowset generated in the FROM clause. 이 경우에 제공된 이름은 SalesPerson입니다.In this case, the name provided is SalesPerson.

    다음은 결과의 일부입니다.This is the partial result:

<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>의 형제로 표시되는 점이 다릅니다.The following query generates the same sales order information, except that in the resulting XML, the <SalesPerson> appears as a sibling of <SalesOrderDetail>:

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

</SalesOrder>  
<SalesOrder>  
  ...  
</SalesOrder>  

다음은 쿼리입니다.This is the query:

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  

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

<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을 쿼리할 수 있습니다.Because the TYPE directive returns a query result as xml type, you can query the resulting XML by using various xml data type methods. 자세한 내용은 xml 데이터 형식 메서드를 참조하십시오.For more information, see xml Data Type Methods. 다음 쿼리에서는 아래 사항을 유의하십시오.In the following query, note the following:

  • 이전 쿼리가 FROM 절에 추가되었습니다.The previous query is added in the FROM clause. 쿼리 결과는 테이블로 반환됩니다.The query result is returned as a table. 추가된 XmlCol 별칭에 유의하십시오.Note the XmlCol alias that is added.

  • SELECT 절은 XmlCol 절에 반환된 FROM 에 대해 XQuery를 지정합니다.The SELECT clause specifies an XQuery against the XmlCol returned in the FROM clause. xml 데이터 형식의 query() 메서드는 XQuery를 지정하는 데 사용됩니다.The query() method of the xml data type is used in specifying the XQuery. 자세한 내용은 query() 메서드(xml 데이터 형식)를 참조하세요.For more information, see query() Method (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)  
    

관련 항목:See Also

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