Форматирование XML-кода на клиенте и на сервере (SQLXML 4.0)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр 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 на стороне сервера столбец метки времени сопоставляется с типом XDR i8 (если параметр XMLDATA указан в запросе).
В форматировании XML на стороне клиента столбец метки времени сопоставляется с типом URI или bin.base64 XDR (в зависимости от того, указан ли в запросе параметр двоичного файла 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 выполняется на стороне клиента (то есть в шаблоне задано значение 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 не указан, и параметр run On Client не выбран для виртуального корневого каталога). Запрос также указывает режим 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, которые сервер распознает.
При указании клиентского xml="1" (true) в шаблоне требуется форматирование XML на стороне клиента. В этом случае можно указать предложение FOR XML NESTED. При указании FOR XML AUTO форматирование XML происходит на стороне сервера, хотя в шаблоне указывается значение "1" на стороне клиента.
См. также
Вопросы безопасности FOR XML (SQLXML 4.0)
Форматирование XML на стороне клиента (SQLXML 4.0)
Форматирование XML-кода на стороне сервера (SQLXML 4.0)