중첩 FOR XML 쿼리 사용

SQL Server 2005부터는 xml 데이터 형식 및 FOR XML 쿼리의 TYPE 지시어를 사용하여 FOR XML 쿼리로 반환되는 XML을 클라이언트는 물론 서버에서도 처리할 수 있습니다.

xml 유형 변수를 사용하여 처리

FOR XML 쿼리 결과를 xml 유형의 변수에 할당하거나 XQuery를 사용하여 결과를 쿼리하고 추가 처리를 위해 이 결과를 xml 유형의 변수에 할당할 수 있습니다.

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" />

또한 xml 데이터 형식 메서드 중 하나를 사용하여 @x 변수에 반환된 XML을 처리할 수 있습니다. 예를 들어 value() 메서드를 사용하여 ProductModelID 특성 값을 검색할 수 있습니다.

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

다음 예에서 TYPE 지시어가 FOR XML 절에 지정되어 있기 때문에 FOR XML 쿼리 결과는 xml 유형으로 반환됩니다.

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

다음은 결과입니다.

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

결과가 xml 유형이기 때문에 다음 쿼리와 같이 이 XML에 대해 xml 데이터 형식 메서드 중 하나를 직접 지정할 수 있습니다. 쿼리에서는 query() 메서드(xml 데이터 형식)를 사용하여 <myRoot> 요소의 첫 번째 <row> 요소 자식을 검색합니다.

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

다음은 결과입니다.

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

내부 FOR XML 쿼리 결과를 외부 쿼리에 xml 유형 인스턴스로 반환

내부 쿼리 결과가 xml 유형으로 외부 쿼리로 반환되는 중첩 FOR XML 쿼리를 작성할 수 있습니다. 예를 들면 다음과 같습니다.

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

이전 쿼리에서 다음을 유의하십시오.

  • 내부 FOR XML 쿼리에서 생성된 XML이 외부 FOR XML에서 생성된 XML에 추가됩니다.

  • 내부 쿼리는 TYPE 지시어를 지정합니다. 따라서 내부 쿼리에서 반환된 XML 데이터는 xml 유형입니다. TYPE 지시어를 지정하지 않으면 내부 FOR XML 쿼리의 결과가 nvarchar(max)로 반환되고 XML 데이터가 올바르게 수정됩니다.

결과 XML 데이터의 형식 제어

중첩 FOR XML 쿼리를 사용하면 결과 XML 데이터 형식을 보다 자유롭게 정의할 수 있습니다. 중첩 FOR XML 쿼리를 사용하여 일부는 특성 중심이고 일부는 요소 중심인 XML을 생성할 수 있습니다.

중첩 FOR XML 쿼리를 사용하여 특성 중심 및 요소 중심 XML을 모두 지정하는 방법은 FOR XML 쿼리와 중첩 FOR XML 쿼리 비교중첩 FOR XML 쿼리로 XML 구체화를 참조하십시오.

중첩된 AUTO 모드 FOR XML 쿼리를 지정하여 형제를 포함하는 XML 계층을 생성할 수 있습니다. 자세한 내용은 중첩 AUTO 모드 쿼리를 사용하여 형제 생성을 참조하십시오.

사용하는 모드에 관계없이 중첩된 FOR XML 쿼리를 사용하면 결과 XML 형식을 보다 자유롭게 설명할 수 있습니다. EXPLICIT 모드 쿼리 대신 이러한 쿼리를 사용할 수 있습니다.

다음 항목에서는 중첩 FOR XML 쿼리의 예를 제공합니다.