Форматирование XML-кода на клиенте и на сервере (SQLXML 4.0)

Применимо к:База данныхSQL Server Azure SQL Управляемый экземпляр SQL Azure

В этом разделе описываются основные различия между форматированием XML-кода в SQLXML на стороне клиента и на стороне сервера.

Запросы к нескольким наборам строк не поддерживаются при форматировании на стороне клиента

Запросы, создающие несколько наборов строк, не поддерживаются при использовании форматирования XML-кода на стороне клиента. Например, предположим, что имеется виртуальный каталог, в котором определено форматирование на стороне клиента. Рассмотрим этот пример шаблона, который содержит две инструкции SELECT в блоке <sql:query> :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query>  
     SELECT FirstName FROM Person.Contact FOR XML Nested;   
     SELECT LastName FROM Person.Contact FOR XML Nested    
  </sql:query>  
</ROOT>  

При выполнении данного шаблона в коде приложения возвращается ошибка, так как форматирование XML-кода на стороне клиента не поддерживает форматирование нескольких наборов строк. Если указать запросы в двух отдельных <блоках sql:query> , вы получите нужные результаты.

Различное сопоставление типа timestamp при форматировании на стороне клиента и на стороне сервера

При форматировании XML на стороне сервера столбец базы данных типа timestamp сопоставляется с типом XDR i8 (если в запросе указан параметр XMLDATA).

При форматировании XML на стороне клиента столбец базы данных типа timestamp сопоставляется либо с URI , либо с типом XDR bin.base64 (в зависимости от того, указан ли в запросе параметр binary base64). Тип XDR bin.base64 полезен при использовании диаграмм обновления и функций массовой загрузки, так как этот тип преобразуется в тип метки времени SQL Server. Таким образом, операции вставки, обновления или удаления выполняются успешно.

При форматировании на стороне сервера используются глубокие типы VARIANT

При форматировании XML-кода на стороне сервера используются глубокие типы VARIANT. При форматировании XML-кода на стороне клиента подтипы VARIANT преобразуются в строку в Юникоде, а вложенные типы VARIANT не используются.

Режим NESTED и режим AUTO

Режим NESTED предложения FOR XML на стороне клиента аналогичен режиму AUTO предложения FOR XML на стороне сервера, за исключением следующих моментов.

При представлении запроса с помощью режима AUTO на стороне сервера имя представления возвращается в виде имени элемента в результирующем XML-коде

Например, предположим, что в таблице Person.Contact базы данных AdventureWorksdatabase создано следующее представление:

CREATE VIEW ContactView AS (SELECT ContactID as CID,  
                               FirstName  as FName,  
                               LastName  as LName  
                        FROM Person.Contact)  

Следующий шаблон указывает запрос к представлению ContactView, а также форматирование XML-кода на стороне сервера:

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT *  
    FROM   ContactView  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

После применения этого шаблона возвращается следующий XML-код (Отображаются только частичные результаты.) Обратите внимание, что имена элементов — это имена представлений, для которых выполняется запрос.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <ContactView CID="1" FName="Gustavo" LName="Achong" />   
  <ContactView CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

При форматировании XML-кода на стороне сервера в режиме NESTED имена базовой таблицы возвращаются в виде имен элементов в результирующем XML-коде. Например, следующий измененный шаблон выполняет ту же инструкцию SELECT, но форматирование XML выполняется на стороне клиента (то есть в шаблоне для client-side-xml задано значение true):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT *  
    FROM   ContactView  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

В результате применения этого шаблона создается следующий XML-код. Обратите внимание, что именем элемента в этом случае является имя базовой таблицы.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact CID="1" FName="Gustavo" LName="Achong" />   
  <Person.Contact CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

При использовании режима AUTO предложения FOR XML на стороне сервера, псевдонимы таблиц, указанные в запросе, возвращаются в виде имен элементов в результирующем XML-коде

Например, рассмотрим следующий шаблон.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

В результате выполнения этого шаблона создается следующий XML-код.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <C fname="Gustavo" lname="Achong" />   
  <C fname="Catherine" lname="Abel" />   
...  
</ROOT>   

При использовании режима NESTED предложения FOR XML на стороне клиента, имена таблиц возвращаются в виде имен элементов в результирующем XML-коде. (Псевдонимы таблиц, указанные в запросе, не используются.) Например, рассмотрим следующий шаблон:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

В результате выполнения этого шаблона создается следующий XML-код.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact fname="Gustavo" lname="Achong" />   
  <Person.Contact fname="Catherine" lname="Abel" />   
...  
</ROOT>  

При наличии запроса, возвращающего столбцы в виде запросов объектов базы данных, использовать псевдонимы для этих столбцов нельзя

Например, рассмотрим следующий шаблон, выполняющий запрос, который возвращает идентификатор и фотографию сотрудника.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query client-side-xml="1">  
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML NESTED, elements  
</sql:query>  
</ROOT>  

Выполнение этого шаблона возвращает столбец Photo в виде запроса объекта базы данных. В запросе объекта базы данных @P ссылается на имя несуществующего столбца.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@P</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

Если форматирование XML выполняется на сервере (client-side-xml="0"), можно использовать псевдоним для столбцов, возвращающих запросы dbobject, в которых возвращаются фактические имена таблиц и столбцов (даже если указаны псевдонимы). Например, следующий шаблон выполняет запрос, а форматирование XML выполняется на сервере (параметр client-side-xml не указан и параметр Выполнить на клиенте не выбран для виртуального корня). Запрос также указывает режим AUTO (а не режим NESTED на стороне клиента).

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query   
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML AUTO, elements  
</sql:query>  
</ROOT>  

При применении этого шаблона возвращается следующий XML-документ (обратите внимание, что псевдонимы в запросе объектов базы данных для столбца LargePhoto не используются):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@LargePhoto</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

Запросы XPath на стороне клиента и на стороне сервера

Запросы XPath на стороне клиента и на стороне сервера работают аналогично, за исключением следующих моментов.

  • Преобразования данных, применяемые при использовании запросов XPath на стороне клиента, отличаются от применяемых при использовании запросов XPath на стороне сервера. Запрос XPath на стороне клиента использует функцию CAST вместо CONVERT mode 126.

  • При указании client-side-xml="0" (false) в шаблоне вы запрашиваете форматирование XML на стороне сервера. Таким образом, нельзя указать предложение FOR XML NESTED, так как сервер не распознает параметр NESTED. Это приводит к ошибке. Необходимо использовать режимы AUTO, RAW или EXPLICIT, которые сервер распознает.

  • При указании client-side-xml="1" (true) в шаблоне запрашивается форматирование XML на стороне клиента. В этом случае можно указать предложение FOR XML NESTED. При указании ПАРАМЕТРА FOR XML AUTO форматирование XML выполняется на стороне сервера, хотя в шаблоне указано client-side-xml="1".

См. также:

Вопросы безопасности FOR XML (SQLXML 4.0)
Форматирование XML на стороне клиента (SQLXML 4.0)
Форматирование XML-кода на сервере (SQLXML 4.0)