FOR XML 쿼리와 중첩 FOR XML 쿼리 비교FOR XML Query Compared to Nested FOR XML Query

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)아니요Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse 이 항목에서는 단일 수준 FOR XML 쿼리를 중첩 FOR XML 쿼리와 비교합니다. This topic compares a single-level FOR XML query to a nested FOR XML query. 중첩 FOR XML 쿼리를 사용할 때의 이점 중 하나는 쿼리 결과에 특성 중심 및 요소 중심의 XML을 조합하여 지정할 수 있다는 점입니다.One of the benefits of using nested FOR XML queries is that you can specify a combination of attribute-centric and element-centric XML for query results. 다음 예에서는 이러한 이점을 보여 줍니다.The example demonstrates this.

예제Example

다음 SELECT 쿼리는 AdventureWorks2012AdventureWorks2012 데이터베이스에서 제품 범주와 하위 범주 정보를 검색합니다.The following SELECT query retrieves product category and subcategory information in the AdventureWorks2012AdventureWorks2012 database. 쿼리에는 중첩 FOR XML이 없습니다.There is no nested FOR XML in the query.

USE AdventureWorks2012;  
GO  
SELECT   ProductCategory.ProductCategoryID,   
         ProductCategory.Name as CategoryName,  
         ProductSubCategory.ProductSubCategoryID,   
         ProductSubCategory.Name  
FROM     Production.ProductCategory, Production.ProductSubCategory  
WHERE    ProductCategory.ProductCategoryID = ProductSubCategory.ProductCategoryID  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  
GO  

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

<ProductCategory ProductCategoryID="1" CategoryName="Bike">  
  <ProductSubCategory ProductSubCategoryID="1" Name="Mountain Bike"/>  
  <ProductSubCategory ProductSubCategoryID="2" Name="Road Bike"/>  
  <ProductSubCategory ProductSubCategoryID="3" Name="Touring Bike"/>  
</ProductCategory>  
...  

쿼리에서 ELEMENTS 지시어를 지정하면 다음 결과 조각에서와 같이 요소 중심 결과를 검색합니다.If you specify the ELEMENTS directive in the query, you receive an element-centric result, as shown in the following result fragment:

<ProductCategory>  
  <ProductCategoryID>1</ProductCategoryID>  
  <CategoryName>Bike</CategoryName>  
  <ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <Name>Mountain Bike</Name>  
  </ProductSubCategory>  
  <ProductSubCategory>  
     ...  
  </ProductSubCategory>  
</ProductCategory>  

그런 후 다음 조각에서와 같이 특성 중심 및 요소 중심 XML이 조합된 XML 계층을 생성한다고 가정하십시오.Next, assume that you want to generate an XML hierarchy that is a combination of attribute-centric and element-centric XML, as shown in the following fragment:

<ProductCategory ProductCategoryID="1" CategoryName="Bike">  
  <ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>  
  <ProductSubCategory>  
     ...  
  <ProductSubCategory>  
     ...  
</ProductCategory>  

이전 조각에서 범주 ID 및 범주 이름과 같은 제품 범주 정보는 특성입니다.In the previous fragment, product category information such as category ID and category name are attributes. 하지만 하위 범주 정보는 요소 중심입니다.However, the subcategory information is element-centric. <ProductCategory> 요소를 생성하기 위해 다음과 같이 FOR XML 쿼리를 작성할 수 있습니다.To construct the <ProductCategory> element, you can write a FOR XML query as shown in the following:

SELECT ProductCategoryID, Name as CategoryName  
FROM Production.ProductCategory ProdCat  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  

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

< ProdCat ProductCategoryID="1" CategoryName="Bikes" />  
< ProdCat ProductCategoryID="2" CategoryName="Components" />  
< ProdCat ProductCategoryID="3" CategoryName="Clothing" />  
< ProdCat ProductCategoryID="4" CategoryName="Accessories" />  

그런 다음 XML에서 원하는 중첩된 <ProductSubCategory> 요소를 생성하려면 다음과 같이 중첩된 FOR XML 쿼리를 추가합니다.To construct the nested <ProductSubCategory> elements in the XML you want, you then add a nested FOR XML query, as shown in the following:

SELECT ProductCategoryID, Name as CategoryName,  
       (SELECT ProductSubCategoryID, Name SubCategoryName  
        FROM   Production.ProductSubCategory  
        WHERE ProductSubCategory.ProductCategoryID =   
              ProductCategory.ProductCategoryID  
        FOR XML AUTO, TYPE, ELEMENTS  
       )  
FROM Production.ProductCategory  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  

이전 쿼리에서 다음을 유의하십시오.Note the following in the previous query:

  • 내부 FOR XML 쿼리는 제품 하위 범주 정보를 검색합니다.The inner FOR XML query retrieves product subcategory information. ELEMENTS 지시어는 외부 쿼리에 의해 생성되는 XML에 추가된 요소 중심 XML을 생성하기 위해 내부 FOR XML 에 추가되어 있습니다.The ELEMENTS directive is added in the inner FOR XML to generate element-centric XML that is added to the XML generated by the outer query. 기본적으로 외부 쿼리는 특성 중심 XML을 생성합니다.By default, the outer query generates attribute-centric XML.

  • 내부 쿼리에서 결과가 TYPE xml 유형이 되도록 지시어를 지정합니다.In the inner query, the TYPE directive is specified so the result is of xml type. TYPE 을 지정하지 않으면 결과가 nvarchar(max) 유형으로 반환되고 XML 데이터는 엔터티로 반환됩니다.If TYPE is not specified, the result is returned as nvarchar(max) type and the XML data is returned as entities.

  • 외부 쿼리도 TYPE 지시어를 지정합니다.The outer query also specifies the TYPE directive. 따라서 이 쿼리의 결과는 클라이언트에 xml 유형으로 반환됩니다.Therefore, the result of this query is returned to the client as xml type.

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

<ProductCategory ProductCategoryID="1" CategoryName="Bike">  
  <ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>  
  <ProductSubCategory>  
     ...  
  <ProductSubCategory>  
     ...  
</ProductCategory>  

다음 쿼리는 이전 쿼리를 확장한 것입니다.The following query is just an extension of the previous query. 여기에서는 AdventureWorks2012AdventureWorks2012 데이터베이스의 전체 제품 계층을 보여 줍니다.It shows the full product hierarchy in the AdventureWorks2012AdventureWorks2012 database. 여기에는 다음이 포함됩니다.This includes the following:

  • 제품 범주Product categories

  • 각 범주의 제품 하위 범주Product subcategories in each category

  • 각 하위 범주의 제품 모델Product models in each subcategory

  • 각 모델의 제품Products in each model

    다음 쿼리는 AdventureWorks2012AdventureWorks2012 데이터베이스를 이해하는 데 도움이 됩니다.You might find the following query useful in understanding the AdventureWorks2012AdventureWorks2012 database:

SELECT ProductCategoryID, Name as CategoryName,  
       (SELECT ProductSubCategoryID, Name SubCategoryName,  
               (SELECT ProductModel.ProductModelID,   
                       ProductModel.Name as ModelName,  
                       (SELECT ProductID, Name as ProductName, Color  
                        FROM   Production.Product  
                        WHERE  Product.ProductModelID =   
                               ProductModel.ProductModelID  
                        FOR XML AUTO, TYPE)  
                FROM   (SELECT distinct ProductModel.ProductModelID,   
                               ProductModel.Name  
                        FROM   Production.ProductModel,   
                               Production.Product  
                        WHERE  ProductModel.ProductModelID =   
                               Product.ProductModelID  
                        AND    Product.ProductSubCategoryID =   
                               ProductSubCategory.ProductSubCategoryID)   
                                  ProductModel  
                FOR XML AUTO, type  
               )  
        FROM Production.ProductSubCategory  
        WHERE ProductSubCategory.ProductCategoryID =   
              ProductCategory.ProductCategoryID  
        FOR XML AUTO, TYPE, ELEMENTS  
       )  
FROM Production.ProductCategory  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  

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

<Production.ProductCategory ProductCategoryID="1" CategoryName="Bikes">  
  <Production.ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <SubCategoryName>Mountain Bikes</SubCategoryName>  
    <ProductModel ProductModelID="19" ModelName="Mountain-100">  
      <Production.Product ProductID="771"   
                ProductName="Mountain-100 Silver, 38" Color="Silver" />  
      <Production.Product ProductID="772"   
                ProductName="Mountain-100 Silver, 42" Color="Silver" />  
      <Production.Product ProductID="773"   
                ProductName="Mountain-100 Silver, 44" Color="Silver" />  
        …  
    </ProductModel>  
     …  

제품 하위 범주를 생성하는 중첩된 ELEMENTS 쿼리에서 FOR XML 지시어를 제거하면 전체 결과가 특성 중심이 됩니다.If you remove the ELEMENTS directive from the nested FOR XML query that generates product subcategories, the whole result is attribute-centric. 그런 다음 중첩 없이 이 쿼리를 작성할 수 있습니다.You can then write this query without nesting. ELEMENTS 를 추가하면 부분적으로 특성 중심이고 요소 중심이기도 한 XML이 생성됩니다.The addition of ELEMENTS results in an XML that is partly attribute-centric and partly element-centric. 이 결과는 단일 수준의 FOR XML 쿼리에 의해 생성될 수 없습니다.This result cannot be generated by a single-level, FOR XML query.

참고 항목See Also

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