예: AUTO 모드 사용

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

다음 예제에서는 AUTO 모드를 사용하는 방법을 보여 줍니다. 이러한 쿼리의 대부분은 AdventureWorks2022 샘플 데이터베이스에 있는 ProductModel 테이블의 Instructions 열에 저장된 자전거 제조 지침 XML 문서에 대해 지정됩니다.

예: 고객, 주문 및 주문 세부 정보 검색

이 쿼리는 특정 고객에 대한 고객, 주문 및 주문 세부 정보 정보를 검색합니다.

USE AdventureWorks2022;
GO
SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       Detail.SalesOrderID, Detail.LineTotal, Detail.ProductID,
       Product.Name,
       Detail.OrderQty
FROM Sales.Customer AS Cust
INNER JOIN Sales.SalesOrderHeader AS OrderHeader
    ON Cust.CustomerID = OrderHeader.CustomerID
INNER JOIN Sales.SalesOrderDetail AS Detail
    ON OrderHeader.SalesOrderID = Detail.SalesOrderID
INNER JOIN Production.Product AS Product
    ON Product.ProductID = Detail.ProductID
WHERE Cust.CustomerID IN (29672, 29734)
ORDER BY OrderHeader.CustomerID,
         OrderHeader.SalesOrderID
FOR XML AUTO;

쿼리가 식별, Cust, OrderHeaderDetailProduct 테이블 별칭을 지정하기 때문에 해당 요소는 모드에서 AUTO 생성됩니다. 또한 절에 지정된 열로 테이블을 식별하는 순서에 SELECT 따라 이러한 요소의 계층 구조가 결정됩니다.

부분 결과입니다.

<Cust CustomerID="29672">
  <OrderHeader CustomerID="29672" SalesOrderID="43660">
    <Detail SalesOrderID="43660" LineTotal="874.794000" ProductID="758" OrderQty="1">
      <Product Name="Road-450 Red, 52" />
    </Detail>
    <Detail SalesOrderID="43660" LineTotal="419.458900" ProductID="762" OrderQty="1">
      <Product Name="Road-650 Red, 44" />
    </Detail>
  </OrderHeader>
  <OrderHeader CustomerID="29672" SalesOrderID="47660">
    <Detail SalesOrderID="47660" LineTotal="469.794000" ProductID="765" OrderQty="1">
      <Product Name="Road-650 Black, 58" />
    </Detail>
  </OrderHeader>
  <OrderHeader CustomerID="29672" SalesOrderID="49857">
    <Detail SalesOrderID="49857" LineTotal="44.994000" ProductID="852" OrderQty="1">
      <Product Name="Women's Tights, S" />
    </Detail>
  </OrderHeader>
...
</Cust>

예: GROUP BY 및 집계 함수 지정

다음 쿼리는 개별 고객 ID와 고객이 요청한 주문 수를 반환합니다.

USE AdventureWorks2022;
GO
SELECT C.CustomerID, COUNT(*) AS NoOfOrders
FROM Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
On C.CustomerID = SOH.CustomerID
GROUP BY C.CustomerID
FOR XML AUTO;

다음은 부분 결과입니다.

<I CustomerID="11000" NoOfOrders="3" />
<I CustomerID="11001" NoOfOrders="3" />
...

예: AUTO 모드에서 계산 열 지정

이 쿼리는 연결된 개별 고객 이름과 주문 정보를 반환합니다. 계산 열은 해당 시점에 발생한 가장 안쪽 수준에 할당되므로 이 예제의 <SOH> 요소입니다. 연결된 고객 이름은 결과에서 요소의 <SOH> 특성으로 추가됩니다.

USE AdventureWorks2022;
GO
SELECT P.FirstName + ' ' + P.LastName AS Name,
       SOH.SalesOrderID
FROM Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
    ON  C.CustomerID = SOH.CustomerID
INNER JOIN Person.Person AS P
    ON P.BusinessEntityID = C.PersonID
FOR XML AUTO;

다음은 부분 결과입니다.

<SOH Name="Jon Yang" SalesOrderID="43793" />
<SOH Name="Eugene Huang" SalesOrderID="43767" />

각 판매 주문 헤더 정보를 하위 요소로 포함하는 특성이 있는 요소를 Name 검색 <IndividualCustomer> 하려면 하위 선택을 사용하여 쿼리를 다시 작성합니다. 내부 선택에서는 개별 고객의 이름을 포함하는 계산 열이 있는 임시 IndividualCustomer 테이블을 만듭니다. 그런 다음 이 테이블을 테이블에 조인 SalesOrderHeader 하여 결과를 얻습니다.

테이블에는 Sales.Customer 해당 고객의 값을 포함하여 PersonID 개별 고객 정보가 저장됩니다. 그런 PersonID 다음 테이블에서 연락처 이름을 Person.Person 찾는 데 사용됩니다.

SELECT IndividualCustomer.Name, SOH.SalesOrderID
FROM (SELECT FirstName+ ' '+LastName AS Name, C.PersonID, C.CustomerID
      FROM Sales.Customer AS C, Person.Person AS P
      WHERE C.PersonID = P.BusinessEntityID) AS IndividualCustomer
LEFT OUTER JOIN  Sales.SalesOrderHeader AS SOH
   ON IndividualCustomer.CustomerID = SOH.CustomerID
ORDER BY IndividualCustomer.CustomerID, SOH.CustomerID FOR XML AUTO;

다음은 부분 결과입니다.

<IndividualCustomer Name="Jon Yang">
  <SOH SalesOrderID="43793" />
  <SOH SalesOrderID="51522" />
  <SOH SalesOrderID="57418" />
</IndividualCustomer>
...

예: 이진 데이터 반환

이 쿼리는 테이블에서 제품 사진을 반환합니다 ProductPhoto . ThumbNailPhoto 는 테이블의 varbinary(max) 열입니다 ProductPhoto . 기본적으로 모드는 AUTO 쿼리가 실행되는 데이터베이스의 가상 루트에 대한 상대 URL인 참조를 이진 데이터로 반환합니다. 이미지를 식별하기 위해서는 ProductPhotoID 키 특성을 지정해야 합니다. 이 예제와 같이 이미지 참조를 검색할 때 행을 고유하게 식별하려면 테이블의 기본 키도 절에 SELECT 지정해야 합니다.

SELECT ProductPhotoID, ThumbNailPhoto
FROM   Production.ProductPhoto
WHERE ProductPhotoID = 70
FOR XML AUTO;

결과는 다음과 같습니다.

<Production.ProductPhoto
  ProductPhotoID="70"
  ThumbNailPhoto= "dbobject/Production.ProductPhoto[@ProductPhotoID='70']/@ThumbNailPhoto" />

동일한 쿼리가 옵션과 함께 BINARY BASE64 실행됩니다. 쿼리는 base64로 인코딩된 형식으로 이진 데이터를 반환합니다.

SELECT ProductPhotoID, ThumbNailPhoto
FROM   Production.ProductPhoto
WHERE ProductPhotoID = 70
FOR XML AUTO, BINARY BASE64;

결과는 다음과 같습니다.

<Production.ProductPhoto ProductPhotoID="70" ThumbNailPhoto="Base64 encoded photo" />

기본적으로 AUTO 모드를 사용하여 이진 데이터를 검색하는 경우 쿼리가 실행된 데이터베이스의 가상 루트에 대한 상대 URL에 대한 참조가 이진 데이터 대신 반환됩니다. 이 문제는 BINARY BASE64 옵션이 지정되지 않은 경우에 발생합니다.

AUTO 모드가 쿼리에 지정된 테이블 또는 열 이름이 데이터베이스의 테이블 또는 열 이름과 일치하지 않는 대/소문자를 구분하지 않는 데이터베이스에서 이진 데이터에 대한 URL 참조를 반환하면 쿼리가 실행됩니다. 그러나 참조에서 반환된 사례는 일관되지 않습니다. 예시:

SELECT ProductPhotoID, ThumbnailPhoto
FROM   Production.ProductPhoto
WHERE  ProductPhotoID=70
FOR XML AUTO;

결과는 다음과 같습니다.

<Production.PRODUCTPHOTO
  PRODUCTPHOTOID="70"
  THUMBNAILPHOTO= "dbobject/Production.PRODUCTPHOTO[@ProductPhotoID='70']/@ThumbNailPhoto" />

이는 특히 대/소문자를 구분하는 데이터베이스에 대해 쿼리를 실행할 때 dbobject 문제가 될 수 있습니다. 이를 방지하려면 쿼리에 지정된 테이블 또는 열 이름의 경우 데이터베이스의 테이블 또는 열 이름의 경우와 일치해야 합니다.

예: 인코딩 이해

이 예제에서는 결과에서 발생하는 다양한 인코딩을 보여 줍니다.

다음 테이블을 만듭니다.

CREATE TABLE [Special Chars] (Col1 char(1) primary key, [Col#&2] varbinary(50));

테이블에 다음 데이터를 추가합니다.

INSERT INTO [Special Chars] VALUES ('&', 0x20), ('#', 0x20);

이 쿼리는 테이블에서 데이터를 반환합니다. FOR XML AUTO 모드가 지정됩니다. 이진 데이터는 참조로 반환됩니다.

SELECT * FROM [Special Chars] FOR XML AUTO;

결과는 다음과 같습니다.

<Special_x0020_Chars Col1="#"
Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='#']/@Col_x0023__x0026_2"
/>
<Special_x0020_Chars Col1="&"
Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='&']/@Col_x0023__x0026_2"
/>

결과에서 특수 문자를 인코딩하는 프로세스입니다.

  • 쿼리 결과에서 반환되는 요소 및 특성 이름의 특수 XML 및 URL 문자는 해당 유니코드 문자의 16진수 값을 사용하여 인코딩됩니다. 이전 결과에서 요소 이름은 <Special Chars> .로 <Special_x0020_Chars>반환됩니다. 특성 이름이 <Col#&2> .로 <Col_x0023__x0026_2>반환됩니다. XML 및 URL 특수 문자는 모두 인코딩됩니다.

  • 요소 또는 특성의 값에 5개의 표준 XML 문자 엔터티(', "", <, >및 &)가 포함된 경우 이러한 특수 XML 문자는 항상 XML 문자 인코딩을 사용하여 인코딩됩니다. 이전 결과에서 특성 <Col1> 값의 값 & 은 로 인코딩됩니다&. 그러나 #문자는 유효한 XML 문자이고 특수 XML 문자가 아니므로 #을 다시 기본.

  • 요소 또는 특성의 값에 URL에 특별한 의미가 있는 특수 URL 문자가 포함된 경우 DBOBJECT URL 값에서만 인코딩되며 특수 문자가 테이블 또는 열 이름의 일부인 경우에만 인코딩됩니다. 결과에서 테이블 이름의 Col#&2 일부인 문자 # 는 로 인코딩됩니다_x0023_ in the DBOJBECT URL.

참고 항목