客户端 XML 格式化 (SQLXML 4.0)

本主题提供了有关客户端 XML 格式化的信息。客户端格式化是指对中间层上的 XML 的格式化。

注意注意

本主题提供了有关使用客户端上的 FOR XML 子句的其他信息,并假定您已熟悉 FOR XML 子句。有关 FOR XML 的详细信息,请参阅使用 FOR XML 构造 XML

重要提示   若要将客户端 FOR XML 功能与新的 xml 数据类型一起使用,客户端应始终使用 SQL Server Native Client (SQLNCLI10) 数据访问接口,而不是 SQLOLEDB 访问接口。SQLNCLI10 为 SQL Server 访问接口的最新版本,且完全识别 SQL Server 2005 中引入的数据类型。使用 SQLOLEDB 访问接口的客户端 FOR XML 的行为会将 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 文档中的元素名称。编写的某些应用程序可能需要基表名称。例如,您可能会执行存储过程并在数据集中加载生成的数据(Microsoft .NET Framework 中),然后生成 DiffGram 以更新表中的数据。在这种情况下,您需要基表信息且必须使用 NESTED 模式。

客户端 XML 格式化的优点

以下是在客户端上进行 XML 格式化的一些优点。

如果您在服务器上具有可返回单个行集的存储过程,则可请求客户端 FOR XML 转换以生成 XML。

例如,请考虑以下存储过程。此过程将返回 AdventureWorks2008R2 数据库的 Person.Person 表中的雇员名字和姓氏:

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 开始,SQL Server 中的 XML 模板已通过添加 client-side-xml 属性而得以增强。如果此属性设置为 True,将在客户端上进行 XML 格式化。请注意,在功能方面此模板特性与特定于 SQLXMLOLEDB 访问接口的 ClientSideXML 属性相同。

注意注意

如果在使用 SQLXMLOLEDB 访问接口的 ADO 应用程序中执行 XML 模板,并且同时指定了该模板中的 client-side-xml 特性和访问接口 ClientSideXML 属性,则在该模板中指定的值优先。