客户端 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 属性,则在该模板中指定的值优先。 |