declare namespace sql='http://schemas.microsoft.com/framework/2003/xml/sql'; <Customers>{ $for $customer in sql:query("select * from customers", "conn")/* return customer }</Customers>
sql:query 方法使您能够对连接进行 T-SQL 查询,其结果以与 XQuery doc() 函数完全相同的风格作为 XML 文档返回。如果结果是由关系类型组成的,则在客户端作为有效流转换成 XML。如果 SQL 查询的结果已经是 XML,例如 FOR XML 查询或 XML 数据类型的查询,则使用该查询的结果。如果没有返回结果,像在大多数 T-SQL DML 语句的情况下,这解释为空文档,它是有效的。来自此 XQuery 的输出如下所示,它列出了用 Customers 元素包装的顾客表中所有的顾客。在结果中自动为表中的每一行创建行元素。
<Customers> <row> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> <ContactTitle>Sales Representative</ContactTitle> <Address>Obere Str. 57</Address> <City>Berlin</City> <PostalCode>12209</PostalCode> <Country>Germany</Country> <Phone>030-0074321</Phone> <Fax>030-0076545</Fax> </row> <row> <CustomerID>ANATR</CustomerID> <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> <ContactName>Ana Trujillo</ContactName> <ContactTitle>Owner</ContactTitle> <Address>Avda. de la Constitucion 2222</Address <City>Mexico D.F.</City <PostalCode>05021</PostalCode> <Country>Mexico</Country> <Phone>(5) 555-4729</Phone> <Fax>(5) 555-3745</Fax> </row> ... </Customers>
为了通过 SQL Server 执行此查询,需要使用下面的代码。
static String ConnectionString = "database=Northwind;Data Source=localhost;Integrated Security=SSPI"; using (SqlConnection connection = new SqlConnection(ConnectionString)) { XmlDataSourceResolver resolver = new XmlDataSourceResolver(); resolver.Add("conn", connection); XQueryCommand xq = new XQueryCommand(); StreamReader reader = new StreamReader("query.xml"); xq.Compile(reader); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.ConformanceLevel = ConformanceLevel.Auto; using (XmlWriter writer = XmlWriter.Create("output.xml", settings)) { try { connection.Open(); xq.Execute(resolver, writer); } catch (Exception e) { Console.Out.WriteLine(e.Message); Console.Out.WriteLine(e.InnerException.Message); } } }
这里,XmlDataSourceResolver 类提供使数据库连接与 sql:query 调用内可以使用的名称相关联的角色。首先从名为 query.xml 的本地文件中读取该查询,再进行编译,然后创建 XmlWriter 来写入结果。需要注意 XmlWriter 中使用的 ConformanceLevel.Auto 设置,它自动检测创建片段还是创建文档,这是必要的,因为可以借此构造结果中的元素,XQuery 能够生成这两者。在执行查询之前,向数据库打开连接,然后执行查询,并将结果写入文件。
sql:query 命令极其灵活而强大,它能够将有名称的参数提供给服务器上的 T-SQL 查询或调用的存储过程。sql:query 中命名的参数的作用完全等同于 System.Data.SqlClient 类。参数是在 T-SQL 查询中提供的,由后面紧跟名称的“@”表示。然后提供该名称和实际值之间的绑定作为查询的参数。对于每个命名的值,可以将相应的值(由序列中的位置决定)用于绑定。必须有与语言绑定数量相同的参数名称。下面的示例最好地对此进行了演示。
declare namespace sql='http://schemas.microsoft.com/framework/2003/xml/sql'; let $country := "USA" <Customers>{ for $customer in sql:query("select * from customers where Country = @country", "conn", {"@country"}, {$country}) return $customer/PostalCode }</Customers>
这里,将参数 country 提供给 T-SQL 查询,从而将 $country XQuery 变量绑定到 @country 参数。结果是所有美国顾客的邮政编码列表。
sql:query 函数还可用于调用 T-SQL 存储过程(如果需要的话,就以上述方式传送参数)。下面的示例显示了如何调用 Northwind 数据库中的“Ten Most Expensive Products”存储过程,它没有输入参数。
declare namespace sql ='http://schemas.microsoft.com/framework/2003/xml/sql'; for $prod in sql:query('Exec "Ten Most Expensive Products"', "conn") return $prod
本文描述了 SQL Server 2005 中 XML 的补充技术。服务器端功能包括 XML 存储、索引和查询处理的本机实现。现有的功能(例如 FOR XML 和 OpenXML)已经得到增强。客户端支持包括增强 ADO.NET 来支持 XML 数据类型,以及在 System.Xml 中支持 XQuery 查询不同的 XML 源。另外,SQLXML 映射技术的 Web 版增强现在已经合并到 SQL Server 2005 中。
客户端和服务器端支持可用于不同的情况。XML 数据类型提供了一种简单的机制来存储 XML 数据,方法是将 XML 数据插入非类型化的 XML 列。使用 XML 架构定义类型化的 XML 有助于数据库引擎优化存储和查询处理,另外,还可以提供数据验证。
XML 数据类型保留了文档顺序,它对于像文档管理这样的应用程序非常有用。它还可以处理递归的 XML 架构。对于带有已知架构的结构化数据,关系数据模型仍然是最佳的选择。[n]varchar(max) 正好适合于查询和更新不重要的情况。
只要是在服务器上对存储在表中的关系数据使用以 XML 为中心的编程模型,就可以使用 SQLXML 映射技术。映射基于将 XML 架构定义为 XML 视图。映射可用于将 XML 数据大量加载到表以及使用 XPath 1.0 来查询表。SQLXML 映射技术不保留文档顺序,因此可用于 XML 数据处理而不是 XML 文档处理。
在即将发布的 .NET 框架 V2.0 Beta 1 版中,System.Xml 内的核心 XML 类支持读、写、操作和转换 XML。通过改进性能、可用性、类型化和查询,V2.0 版对 XML 的支持在创新性、标准支持和易用性方面继续保持行业领先。这包括用于操作 SQL Server 外的 XML 源的 XQuery 处理器在内。
服务器端技术和客户端技术互为补充。映射技术可以利用服务器端功能来增加其功能,例如维护文档顺序和递归架构,以及找到更多的应用领域。另一方面,CLR 将可扩展性和现有 XML 工具(如 XSLT 转换)的价值带入了 XML 数据类型。服务器和客户端中的 XQuery 实现彼此之间以及与 2003 年 11 月发布的 XQuery 规范草稿之间都是一致的。XML 架构实现在服务器端实现和中间层实现之间也是一致的。
Shankar Pal 是 SQL Server 引擎的程序经理,主要研究服务器端 XML 技术。
Mark Fussell 是 Microsoft 的 WebData 组的首席程序经理,该小组负责开发 Microsof 的数据访问技术,其中包括 .NET 框架的 System.Xml 和 System.Data 命名空间中的组件、Microsoft XML 核心服务 (MSXML) 以及 Microsoft 数据访问组件 (MDAC)。他的网络日记存放在http://weblogs.asp.net/mfussell。
Irwin Dolobowsky 是 Webdata 组的程序经理。