Поделиться через


Примеры. Использование режима AUTO

В следующих примерах показано использование режима AUTO. Многие из этих запросов указываются для XML-документов инструкции по производству велосипедов, которые хранятся в столбце "Инструкции" таблицы ProductModel, в примере базы данных AdventureWorks2012.

Пример: получение сведений о клиенте, заказе и подробностях заказа

Этот запрос извлекает сведения о клиенте, заказе и деталях заказа для конкретного клиента.

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;  

Так как запрос идентифицирует, CustOrderHeaderи DetailProduct псевдонимы таблиц, соответствующие элементы создаются в режиме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 и агрегатных функций

Следующий запрос возвращает идентификаторы отдельных клиентов и количество запрошенных клиентом заказов.

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> элементы с Name атрибутом, который в качестве подэлемента содержит информацию о каждом заголовке заказа продаж, запрос перезаписывается с использованием подзапроса. Внутренний запрос создает временную 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.CustomerIDFOR 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;  

Результат:

-- 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-адреса в именах элементов и атрибутов, возвращаемых, кодируются с помощью шестнадцатеричного значения соответствующего символа Юникода. В предыдущем результате имя элемента <Special Chars> возвращается как .<Special_x0020_Chars> Имя атрибута <Col#&2> возвращается как <Col_x0023__x0026_2>. Кодируются специальные символы XML и URL-адреса.

  • Если значения элементов или атрибутов содержат какие-либо из пяти стандартных сущностей СИМВОЛОВ XML (', "", <, >и &), эти специальные XML-символы всегда кодируются с помощью кодировки XML-символов. В предыдущем результате значение & в значении атрибута><Col1закодировано как .& Однако символ #остается #, так как он является допустимым XML-символом, а не специальным XML-символом.

  • Если значения элементов или атрибутов содержат специальные символы URL-адреса, имеющие особое значение в URL-адресе, они кодируются только в значении URL-адреса DBOBJECT и кодируются только в том случае, если специальный символ является частью имени таблицы или столбца. В результате символ # , который является частью имени Col#&2 таблицы, закодирован как _x0023_ in the DBOJBECT URL.

См. также

Используйте режим AUTO с FOR XML