FOR XML에서 AUTO 모드 사용

적용 대상:SQL ServerAzure SQL DatabaseAzure 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 값은 CustomerID가 테이블의 기본 키이므로 Cust> 요소를 만들 <때 한 행에서 다음 행으로 비교됩니다. CustomerID가 테이블의 기본 키로 식별되지 않으면 모든 열 값(CustomerID, 이 쿼리의 CustomerType)이 한 행에서 다음 행으로 비교됩니다. 값이 다르면 새 <Cust> 요소가 XML에 추가됩니다.

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

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

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

다음 단계

다음 문서에서는 AUTO 모드에 대한 자세한 정보를 제공합니다.

참고 항목