예: 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
, 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 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
.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기