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


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

В этом разделе содержатся сведения о форматировании XML на стороне клиента. Форматирование на стороне означает форматирование XML на среднем уровне.

ПримечаниеПримечание

В этом разделе содержатся дополнительные сведения об использовании предложения FOR XML на стороне клиента и предполагается предварительное знакомство с предложением FOR XML. Дополнительные сведения о предложении FOR XML см. в разделе Создание XML с помощью предложения FOR XML.

Внимание! Для использования функциональности FOR XML на стороне клиента с новым типом данных xml клиент должен всегда пользоваться поставщиком данных собственного клиента SQL Server (SQLNCLI10), а не поставщиком SQLOLEDB. SQLNCLI10 — является самой последней версией поставщика SQL Server, которая умеет работать со всеми типами данных, появившимися в SQL Server 2005. FOR XML на стороне клиента с поставщиком SQLOLEDB воспринимает типы данных xml как строки.

Форматирование XML-документов на стороне клиента

Предположим, клиентское приложение выполняет следующий запрос.

SELECT FirstName, LastName
FROM   Person.Person
FOR XML RAW;

Только этот фрагмент запроса будет отправлен на сервер.

SELECT FirstName, LastName
FROM   Person.Person

Сервер выполняет запрос и возвращает клиенту набор строк (который содержит столбцы FirstName и LastName). Затем средний уровень применяет к набору строк преобразование FOR XML и возвращает XML-форматирование клиенту.

Аналогичным образом, при выполнении запроса XPath сервер возвращает клиенту набор строк, а затем к набору строк на стороне клиента применяется преобразование FOR XML EXPLICIT, создавая нужное XML-форматирование.

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

Режим FOR XML на стороне клиента

Комментарии

RAW

Выдает одинаковый результат при указании в FOR XML на стороне клиента или сервера.

NESTED

Похож на режим FOR XML AUTO на стороне сервера.

EXPLICIT

Похож на режим FOR XML EXPLICIT на стороне сервера.

ПримечаниеПримечание

Если указать режим AUTO и запросить XML-форматирование на стороне клиента, то запрос будет целиком отправлен на сервер, то есть XML-форматирование будет выполняться на сервере. Это сделано для удобства, но обратите внимание, что режим NESTED возвращает имена базовых таблиц в созданном в XML-документе как имена элементов. Для некоторых создаваемых пользователем приложений могут потребоваться имена базовых таблиц. Например, можно выполнить хранимую процедуру и загрузить результирующие данные в Dataset (на платформе Microsoft .NET Framework), а затем создать дельту для обновления данных в таблицах. В таком случае потребуются сведения о базовой таблице, и поэтому придется использовать режим NESTED.

Преимущества форматирования XML-кода на стороне клиента

Ниже приведены некоторые преимущества форматирования XML-кода на стороне клиента.

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

Рассмотрим следующую хранимую процедуру. Данная процедура возвращает имена и фамилии сотрудников из таблицы Person.Person в базе данных База данных AdventureWorks2008R2:

IF EXISTS (SELECT name FROM sys.objects
   WHERE name = 'GetContacts' AND type = 'P')
   DROP PROCEDURE GetContacts;
GO
CREATE PROCEDURE GetContacts
AS
    SELECT   FirstName, LastName
    FROM     Person.Person;

Следующий образец XML-шаблона выполняет хранимую процедуру. Предложение FOR XML указывается после имени хранимой процедуры.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <sql:query client-side-xml="1">
    EXEC GetContacts FOR XML NESTED
  </sql:query>
</ROOT>

Поскольку атрибуту client-side-xml в шаблоне присвоено значение 1 (true), хранимая процедура выполняется на сервере, а возвращаемый сервером набор строк из двух столбцов преобразуется в XML на среднем уровне и возвращается клиенту (здесь показан только фрагмент результата).

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Person.Person FirstName="Gustavo" LastName="Achong" /> 
  <Person.Person FirstName="Catherine" LastName="Abel" />
</ROOT>
ПримечаниеПримечание

При использовании поставщика SQLXMLOLEDB или управляемых классов SQLXML можно при помощи свойства ClientSideXml задать форматирование XML на стороне клиента.

Рабочая нагрузка лучше сбалансирована

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

Поддержка форматирования XML-кода на стороне клиента

Поддержку форматирования XML-кода на стороне клиента обеспечивают следующие компоненты SQLXML:

  • Поставщик SQLXMLOLEDB

  • Управляемые классы SQLXML

  • Улучшенная поддержка XML-шаблонов

  • Свойство SqlXmlCommand.ClientSideXml

    Установив это свойство управляемых классов SQLXML в значение true, можно задать форматирование на стороне клиента.

Улучшенная поддержка XML-шаблонов

Начиная с версии SQL Server 2005, XML-шаблоны в SQL Server были улучшены благодаря добавлению атрибута client-side-xml. Если значение этого атрибута установлено в значение true, то XML-форматирование выполняется на стороне клиента. Обратите внимание, что этот атрибут шаблона обеспечивает ту же функциональность, что и определяемое поставщиком SQLXMLOLEDB свойство ClientSideXML.

ПримечаниеПримечание

Если в приложении ADO, которое пользуется поставщиком SQLXMLOLEDB, выполнить XML-шаблон, в котором определен и атрибут client-side-xml, и свойство поставщика ClientSideXML, то больший приоритет имеет значение, указанное в шаблоне.