客户端 XML 格式化 (SQLXML 4.0)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

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

注意

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

SQLNCLI11是 SQL Server 提供程序的第一个版本,用于完全了解 SQL Server 2005(9.x)中引入的数据类型。 客户端 FOR XML 与 SQLOLEDB 提供程序的行为会将 xml 数据类型视为字符串。

重要

SQL Server Native Client (SNAC) 未随附:

  • SQL Server 2022 (16.x) 及更高版本
  • SQL Server Management Studio 19 及更高版本

不建议使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)进行新的应用程序开发。

对于新项目,请使用以下驱动程序之一:

对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例

对客户端上的 XML 文档进行格式化

当客户端应用程序执行以下查询时:

SELECT FirstName, LastName  
FROM   Person.Contact  
FOR XML RAW  

...仅此部分的查询发送到服务器:

SELECT FirstName, LastName  
FROM   Person.Contact  

服务器执行查询并将行集(其中包含 FirstName 和 LastNamecolumns)返回到客户端。 然后,中间层对行集应用 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。

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

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

以下 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>  

由于客户端 xml 属性在模板中设置为 1(true),因此存储过程在服务器上执行,服务器返回的双列行集将转换为中间层上的 XML,并返回到客户端。 (此处仅显示部分结果。)

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

注意

使用 SQLXMLOLEDB 提供程序或 SQLXML 托管类时,可以使用 ClientSideXml 属性请求客户端 XML 格式。

工作负荷更加均衡。

由于客户端进行 XML 格式化,因此会在服务器与客户端之间均衡工作负荷,从而释放服务器执行其他操作。

支持客户端 XML 格式化

为了支持客户端 XML 格式化功能,SQLXML 提供:

  • SQLXMLOLEDB 访问接口

  • SQLXML 托管类

  • 增强的 XML 模板支持

  • SqlXmlCommand.ClientSideXml 属性

    通过将 SQLXML 托管类的此属性设置为 True,可指定客户端格式。

增强的 XML 模板支持

从 SQL Server 2005 (9.x)开始,SQL Server 中的 XML 模板通过添加 客户端 xml 属性进行了增强。 如果此属性设置为 True,将在客户端上进行 XML 格式化。 请注意,此模板属性的功能与特定于 SQLXMLOLEDB 提供程序的 ClientSideXML 属性相同。

注意

如果在使用 SQLXMLOLEDB 提供程序的 ADO 应用程序中执行 XML 模板,并在模板和提供程序 ClientSideXML 属性中同时指定 客户端 xml 属性,则模板中指定的值优先。

另请参阅

客户端和服务器端 XML 格式化的体系结构 (SQLXML 4.0)
FOR XML (SQL Server)
FOR XML 安全注意事项 (SQLXML 4.0)
SQLXML 4.0 中的 xml 数据类型支持
SQLXML 托管类
客户端 XML 格式与服务器端 XML 格式设置(SQLXML 4.0)
SqlXmlCommand 对象(SQLXML 托管类)
XML 数据 (SQL Server)