客户端 XML 格式化 (SQLXML 4.0)

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

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

注意

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

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

重要

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中删除SQL Server Native Client(通常缩写为 SNAC)。 不建议在新应用程序开发工作中使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 请在此后切换为使用新版 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新版的 Microsoft OLE DB Driver for SQL Server。 对于作为 SQL Server 数据库引擎组件附带的 SQLNCLI (版本 2012 到 2019) ,请参阅此支持生命周期异常

对客户端上的 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>  

由于在模板中将 client-side-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 模板支持

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

注意

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

另请参阅

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