다음을 통해 공유


AUTO 모드를 FOR XML과 함께 사용하기

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance

FOR XML (SQL Server)에서 설명한 바와 같이 AUTO 모드는 쿼리 결과를 중첩된 XML 요소로 반환합니다. 이것은 쿼리 결과에서 생성된 XML의 형태를 크게 제어하지 못합니다. AUTO 모드 쿼리는 간단한 계층을 생성하려는 경우에 유용합니다. 그러나 FOR XML에서 EXPLICIT 모드 사용FOR XML에서 PATH 모드 사용 에서는 쿼리 결과로 생성되는 XML의 모양을 좀 더 상세하게 조정할 수 있습니다.

최소한 한 개의 해당 열이 SELECT 절에 나열되는 FROM 절의 각 테이블은 XML 요소로 표시됩니다. 선택적 ELEMENTS 옵션이 FOR XML 절에 지정될 경우 SELECT 절에 나열된 열은 특성 또는 하위 요소에 매핑됩니다.

결과 XML의 XML 계층 구조, 즉 요소들의 중첩은 SELECT 절에서 지정된 열로 식별되는 테이블들의 순서에 기반합니다. 따라서 SELECT 절에서 열 이름을 지정하는 순서는 중요한 의미를 갖습니다. 식별되는 맨 왼쪽 첫 번째 테이블이 결과 XML 문서의 최상위 요소를 형성합니다. SELECT 문의 열로 식별된 맨 왼쪽 두 번째 테이블은 최상위 요소 내의 하위 요소를 형성하며, 이러한 식으로 계속해서 진행됩니다.

SELECT 절에 나열된 열 이름이 이전에 지정된 SELECT 절의 열로 이미 식별된 테이블에서 온 경우 열은 계층 구조의 새로운 수준을 여는 대신 이미 생성된 요소의 특성으로 추가됩니다. ELEMENTS 옵션이 지정된 경우 열이 특성으로 추가됩니다.

예를 들어 다음 쿼리를 실행하십시오.

SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status,
       Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO;

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

<Cust CustomerID="1" CustomerType="S">
  <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />
  <OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />
  <OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />
  <OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />
</Cust>
...

SELECT 절에서 다음에 유의하십시오.

  • CustomerID는 Cust 테이블을 참조합니다. 따라서 <Cust> 요소가 생성되고 CustomerID는 이 요소의 특성으로 추가됩니다.

  • 그런 다음 OrderHeader.CustomerID, OrderHeader.SaleOrderID 및 OrderHeader.Status의 3개 열은 OrderHeader 테이블을 참조합니다. 따라서 <OrderHeader> 요소가 <Cust> 요소의 하위 요소로 추가되고 세 개의 열이 <OrderHeader>의 특성으로 추가됩니다.

  • 다음으로 Cust.CustomerType 열은 Cust.CustomerID 열로 이미 식별된 Cust 테이블을 다시 참조합니다. 따라서 새로운 요소는 생성되지 않습니다. 대신 CustomerType 특성이 이전에 생성된 <Cust> 요소에 추가됩니다.

  • 쿼리는 테이블 이름에 별칭을 지정합니다. 이러한 별칭은 상응하는 요소 이름으로 표시됩니다.

  • ORDER BY는 한 부모 아래의 모든 자식을 그룹화하는 데 필요합니다.

SELECT 절이 Cust 테이블의 열 앞에 OrderHeader 테이블의 열을 지정하는 것을 제외하고 이 쿼리는 이전의 쿼리와 유사합니다. 따라서 먼저 <OrderHeader> 요소가 생성되고, 이후 <Cust> 자식 요소가 여기에 추가됩니다.

select OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status,
       Cust.CustomerID,
       Cust.CustomerType
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
where Cust.CustomerID = OrderHeader.CustomerID
for xml auto;

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

<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">
  <Cust CustomerID="1" CustomerType="S" />
</OrderHeader>
...

ELEMENTS 옵션이 FOR XML 절에 추가된 경우 요소 중심 XML이 반환됩니다.

SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status,
       Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS

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

<Cust>
  <CustomerID>1</CustomerID>
  <CustomerType>S</CustomerType>
  <OrderHeader>
    <CustomerID>1</CustomerID>
    <SalesOrderID>43860</SalesOrderID>
    <Status>5</Status>
  </OrderHeader>
   ...
</Cust>
...

이 쿼리에서는 CustomerID가 테이블의 기본 키이므로 <Cust> 요소 생성 시 한 행에서 다음 행으로 나아가며 CustomerID 값이 비교됩니다. CustomerID가 테이블의 기본 키로 식별되지 않을 경우 한 행에서 다음 행으로 나아가며 모든 열 값(이 쿼리의 CustomerID, CustomerType)이 비교됩니다. 값이 다를 경우 새로운 <Cust> 요소가 XML에 추가됩니다.

이러한 열 값을 비교할 때 비교되는 열이 텍스트, ntext, 이미지, 또는 xml 형식일 경우에는 설령 값이 동일하다고 하더라도 FOR XML에서는 해당 값이 상이하며 비교되지 않는다고 가정합니다. 이는 큰 개체의 비교가 지원되지 않기 때문입니다. 요소가 선택된 각 행의 결과에 추가됩니다. (n)varchar(max)varbinary(max) 열이 비교됩니다.

집계 열 또는 계산 열의 경우처럼 SELECT 절의 열을 FROM 절에서 식별되는 테이블과 연결할 수 없는 경우 열은 목록에서 대면할 때 가장 깊은 중첩 수준에 자리하는 XML 문서에 추가됩니다. 이러한 열이 SELECT 절의 첫 번째 열로 나타날 경우 열은 최상위 요소에 추가됩니다.

별표(*) 와일드카드 문자를 SELECT 절에 지정하는 경우 위에 설명한 방법과 동일한 방식으로 행이 쿼리 엔진에 의해 반환되는 순서에 따라 중첩이 결정됩니다.

다음 단계

다음 문서에서는 AUTO 모드에 대해 더 자세한 내용을 다룹니다.

참고 항목