다음을 통해 공유


예: AUTO 모드 사용

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

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

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

USE AdventureWorks2012;  
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, OrderHeader, Detail, Product 테이블 별칭을 식별하기 때문에 해당 요소는 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 AdventureWorks2012;  
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;This is the partial result:  

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

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

...

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

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

USE AdventureWorks2012;  
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" />  

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

Sales.Customer 테이블은 해당 고객의 PersonID 값을 비롯하여 개별 고객 정보를 저장합니다. 이 PersonIDPerson.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.CustomerIDFOR XML AUTO;  

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

<IndividualCustomer Name="Jon Yang">

<SOH SalesOrderID="43793" />

<SOH SalesOrderID="51522" />

<SOH SalesOrderID="57418" />

</IndividualCustomer>

...

...

예: 이진 데이터 반환

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

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

다음은 결과입니다.

-- result

<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;  

다음은 결과입니다.

-- result

<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.

또한 참조하십시오

FOR XML에서 AUTO 모드 사용