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

xml 데이터 형식 및 FOR XML 쿼리의 TYPE 지시어 를 사용하여 FOR XML 쿼리로 반환되는 XML을 클라이언트는 물론 서버에서도 처리할 수 있습니다.The xml data type and the TYPE directive in FOR XML queries enable the XML returned by the FOR XML queries to be processed on the server as well as on the client.

xml 유형 변수를 사용하여 처리Processing with xml Type Variables

FOR XML 쿼리 결과를 xml 유형의 변수에 할당하거나 XQuery를 사용하여 결과를 쿼리하고 추가 처리를 위해 이 결과를 xml 유형의 변수에 할당할 수 있습니다.You can assign the FOR XML query result to an xml type variable, or use XQuery to query the result, and assign that result to an xml type variable for more processing.

DECLARE @x xml  
SET @x=(SELECT ProductModelID, Name  
        FROM Production.ProductModel  
        WHERE ProductModelID=122 or ProductModelID=119  
        FOR XML RAW, TYPE)  
SELECT @x  
-- Result  
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />  
--<row ProductModelID="119" Name="Bike Wash" />  

또한 @x데이터 형식 메서드 중 하나를 사용하여 xml 변수에 반환된 XML을 처리할 수 있습니다.You can additionally process the XML returned in the variable, @x, by using one of the xml data type methods. 예를 들어 ProductModelID value() 메서드 를 사용하여특성 값을 검색할 수 있습니다.For example, you can retrieve the ProductModelID attribute value by using the value() method.

DECLARE @i int;  
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));  
SELECT @i;  

다음 예에서 FOR XML 지시어가 xml 절에 지정되어 있기 때문에 TYPE 쿼리 결과는 FOR XML 유형으로 반환됩니다.In the following example, the FOR XML query result is returned as an xml type, because the TYPE directive is specified in the FOR XML clause.

SELECT ProductModelID, Name  
FROM Production.ProductModel  
WHERE ProductModelID=119 or ProductModelID=122  
FOR XML RAW, TYPE,ROOT('myRoot');  

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

<myRoot>  
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />  
  <row ProductModelID="119" Name="Bike Wash" />  
</myRoot>  

결과가 xml 유형이기 때문에 다음 쿼리와 같이 이 XML에 대해 xml 데이터 형식 메서드 중 하나를 직접 지정할 수 있습니다.Because the result is of xml type, you can specify one of the xml data type methods directly against this XML, as shown in the following query. 쿼리에서는 query() 메서드(xml 데이터 형식)를 사용하여 <row> 요소의 첫 번째 <myRoot> 요소 자식을 검색합니다.In the query, the query() method (xml Data Type) is used to retrieve the first <row> element child of the <myRoot> element.

SELECT  (SELECT ProductModelID, Name  
         FROM Production.ProductModel  
         WHERE ProductModelID=119 or ProductModelID=122  
         FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');  

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

<row ProductModelID="122" Name="All-Purpose Bike Stand" />  

내부 FOR XML 쿼리 결과를 외부 쿼리에 xml 유형 인스턴스로 반환Returning Inner FOR XML Query Results to Outer Queries as xml Type Instances

내부 쿼리 결과가 FOR XML 유형으로 외부 쿼리로 반환되는 중첩 xml 쿼리를 작성할 수 있습니다.You can write nested FOR XML queries where the result of the inner query is returned as an xml type to the outer query. 예를 들어For example:

SELECT Col1,   
       Col2,   
       ( SELECT Col3, Col4   
        FROM  T2  
        WHERE T2.Col = T1.Col  
        ...  
        FOR XML AUTO, TYPE )  
FROM T1  
WHERE ...  
FOR XML AUTO, TYPE;  

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

  • 내부 FOR XML 쿼리에서 생성된 XML이 외부 FOR XML에서 생성된 XML에 추가됩니다.The XML generated by the inner FOR XML query is added to the XML generated by the outer FOR XML.

  • 내부 쿼리는 TYPE 지시어를 지정합니다.The inner query specifies the TYPE directive. 따라서 내부 쿼리에서 반환된 XML 데이터는 xml 유형입니다.Therefore, the XML data returned by the inner query is of xml type. TYPE 지시어를 지정하지 않으면 내부 FOR XML 쿼리의 결과가 nvarchar(max) 로 반환되고 XML 데이터가 올바르게 수정됩니다.If the TYPE directive is not specified, the result of the inner FOR XML query is returned as nvarchar(max) and the XML data is entitized.

결과 XML 데이터의 형식 제어Controlling the Shape of Resulting XML Data

중첩 FOR XML 쿼리를 사용하면 결과 XML 데이터 형식을 보다 자유롭게 정의할 수 있습니다.Nested FOR XML queries give you more control in defining the shape of the resulting XML data. 중첩 FOR XML 쿼리를 사용하여 일부는 특성 중심이고 일부는 요소 중심인 XML을 생성할 수 있습니다.You can use nested FOR XML queries to construct XML that is partly attribute-centric and partly element-centric.

중첩 FOR XML 쿼리로 특성 중심 및 요소 중심 XML을 모두 지정하는 방법은 FOR XML 쿼리와 중첩 FOR XML 쿼리 비교중첩 FOR XML 쿼리로 XML 구체화를 참조하세요.For more information about specifying both attribute-centric and element-centric XML with nested FOR XML queries, see FOR XML Query Compared to Nested FOR XML Query and Shape XML with Nested FOR XML Queries.

중첩된 AUTO 모드 FOR XML 쿼리를 지정하여 형제를 포함하는 XML 계층을 생성할 수 있습니다.You can generate XML hierarchies that include siblings by specifying nested AUTO mode FOR XML queries. 자세한 내용은 중첩 AUTO 모드 쿼리를 사용하여 형제 생성을 참조하세요.For more information, see Generate Siblings with a Nested AUTO Mode Query.

사용하는 모드에 관계없이 중첩된 FOR XML 쿼리를 사용하면 결과 XML 형식을 보다 자유롭게 설명할 수 있습니다.Regardless of which mode you use, nested FOR XML queries provide more control in describing the shape of the resulting XML. EXPLICIT 모드 쿼리 대신 이러한 쿼리를 사용할 수 있습니다.They can be used in the place of EXPLICIT mode queries.

Examples

다음 항목에서는 중첩 FOR XML 쿼리의 예를 제공합니다.The following topics provide examples of nested FOR XML queries.

FOR XML 쿼리와 중첩 FOR XML 쿼리 비교FOR XML Query Compared to Nested FOR XML Query
단일 수준 FOR XML 쿼리를 중첩 FOR XML 쿼리와 비교합니다.Compares a single-level FOR XML query to a nested FOR XML query. 이 예에서는 특성 중심 및 요소 중심 XML 둘 모두를 쿼리 결과로 지정하는 방법을 보여 줍니다.This example includes a demonstration of how to specify both attribute-centric and element-centric XML as the result of the query.

중첩 AUTO 모드 쿼리를 사용하여 형제 생성Generate Siblings with a Nested AUTO Mode Query
중첩 AUTO 모드 쿼리를 사용하여 형제를 생성하는 방법을 보여 줍니다.Shows how to generate siblings by using a nested AUTO mode query

ASP.NET에서 중첩 FOR XML 쿼리 사용Use Nested FOR XML Queries in ASP.NET
ASPX 응용 프로그램이 FOR XML을 사용하여 SQL ServerSQL Server에서 XML을 반환할 수 있는 방법을 보여 줍니다.Demonstrates how an ASPX application can use FOR XML to return XML from SQL ServerSQL Server.

중첩 FOR XML 쿼리로 XML 구체화Shape XML with Nested FOR XML Queries
중첩 FOR XML 쿼리를 사용하여 SQL ServerSQL Server에서 만들어진 XML 문서의 구조를 제어하는 방법을 보여 줍니다.Shows how to use nested FOR XML queries to control the structure of an XML document created by SQL ServerSQL Server.