WEB开发网
开发学院数据库MSSQL Server 新版本突显原生 XML 类型和高级数据处理的优势 阅读

新版本突显原生 XML 类型和高级数据处理的优势

 2007-11-11 08:41:42 来源:WEB开发网   
核心提示:本文是根据 Microsoft sql server(WINDOWS平台上强大的数据库平台)(代号为“Yukon”)Beta 1 撰写的,其中包含的所有信息均可能发生更改,新版本突显原生 XML 类型和高级数据处理的优势,下载本文的代码:xml(标准化越来越近了)inYukon.exe (114KB)(标准化越来越近了

本文是根据 Microsoft sql server(WINDOWS平台上强大的数据库平台)(代号为“Yukon”)Beta 1 撰写的,其中包含的所有信息均可能发生更改。

下载本文的代码:xml(标准化越来越近了)inYukon.exe (114KB)

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />xml(标准化越来越近了) 数据类型
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />xml(标准化越来越近了) 索引
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />xml(标准化越来越近了) 数据类型函数
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />XQuery 1.0 — 一种 xml(标准化越来越近了) 查询语言
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />使用 XQuery 函数
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />sql server(WINDOWS平台上强大的数据库平台) 中的 XQuery 扩展函数
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />xml(标准化越来越近了) DML — 更新 xml(标准化越来越近了)
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />FOR xml(标准化越来越近了) 和 Openxml(标准化越来越近了) 的增强功能
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />原生 Web 服务支持
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图一)" />总结

Microsoft sql server(WINDOWS平台上强大的数据库平台)? 的下一个版本(代号“Yukon”)吸收了在 sql server(WINDOWS平台上强大的数据库平台) 2000 中引入的开创性 xml(标准化越来越近了) 支持,并为它加入更多创新性功能并且赋予它更好的易用性。Yukon 通过一种新的原生 xml(标准化越来越近了) 数据类型为数据库管理系统 (DBMS) 添加了原生 xml(标准化越来越近了) 数据存储。这种原生 xml(标准化越来越近了) 数据类型的引入,再结合新兴的行业标准 XQuery 语言,将在数据库应用程序开发中引发一场革命。

对原生 xml(标准化越来越近了) 数据类型的支持是广泛的。它包括基于 xml(标准化越来越近了) 架构的验证和基于 xml(标准化越来越近了) 的附加约束、基于 xml(标准化越来越近了) Infoset 的特殊索引以及使用 XQuery 对 xml(标准化越来越近了) 内容对象的查询。除了这个主要的新功能之外,为了获得更好的性能和易用性,还对现有的 sql server(WINDOWS平台上强大的数据库平台) 2000 xml(标准化越来越近了) 功能进行了细微的调整。

xml(标准化越来越近了) 本身是一种与平台无关的数据表示格式,最初作为文档格式使用。由于 xml(标准化越来越近了) 已经获得广泛认可,用户已经设法解决了 xml(标准化越来越近了) 解决棘手的业务问题,如数据集成。这就使得作为数据存储格式的 xml(标准化越来越近了) 不断发展。xml(标准化越来越近了),像其结构化的对应物一样,有基于 xml(标准化越来越近了) 架构定义语言 (XSD) 的自有类型系统。xml(标准化越来越近了) 和 XSD 均为推荐级的 W3C 标准。xml(标准化越来越近了) 架构定义 xml(标准化越来越近了) 文档的格式,正如 sql server(WINDOWS平台上强大的数据库平台) 架构定义 sql server(WINDOWS平台上强大的数据库平台) 数据库中对象的布局一样。xml(标准化越来越近了) 类型系统相当严密;XSD 几乎可以定义关系型数据库、面向对象的类型系统、半结构化和非结构化的文档格式中的所有构造。(请参见提要栏“aspx?side=true#a" target="_blank">标准依从性”。)

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图二)" />

图 1 用 FOR xml(标准化越来越近了) 返回的具有层次结构的 xml(标准化越来越近了)

 

xml(标准化越来越近了) 数据具有层次结构,并且在业务应用程序中使用的 xml(标准化越来越近了) 文档通常由存储在多个关系表中的数据组成。例如,一个 xml(标准化越来越近了) 定单文档可能包含客户信息、定单信息以及定单细节信息。在关系型数据库中,通常将这样的信息存储在多个表中。在 sql server(WINDOWS平台上强大的数据库平台) 2000 中,如果要存储 xml(标准化越来越近了),有两种选择:将整个文档存储在一个文本字段中,或者将文档分解为多个关系表。如果选择文本字段存储,则用 sql server(WINDOWS平台上强大的数据库平台) 仅能存储和检索数据;而对文档内容的查询则发生在客户端库中。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图三)" />

图 2 用 Openxml(标准化越来越近了) 生成表

 

在 sql server(WINDOWS平台上强大的数据库平台) 2000 中,使用 Transact-SQL (T-SQL) SELECT 语句的 FOR xml(标准化越来越近了) 扩展,可以查询多个关系表,并可将返回的数据组合成具有层次结构的 xml(标准化越来越近了) 文档,如图 1 所示。系统定义的 OPENxml(标准化越来越近了) 函数完成文档的分解,如图 2 所示,同时还允许在 xml(标准化越来越近了) 和关系数据之间进行分布式关系查询。在 Yukon 中,增强了这种支持,引入了合成、分解以及分布式关系查询。此外,还引入了原生 xml(标准化越来越近了) 查询和原生 xml(标准化越来越近了) 存储,如图 3 所示。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图四)" />

图 3 xml(标准化越来越近了) 存储

 

xml(标准化越来越近了) 数据类型

让我们来看看 xml(标准化越来越近了) 数据类型,并分析它与 xml(标准化越来越近了) 文档的传统存储方式 — 文本数据类型 — 的区别。包括用作表中的一列、T-SQL 中的一个变量、存储过程或用户定义的函数的参数,或者用作用户定义的函数的返回值。

ML 类型与 SQL-100(ANSI SQL 标准的最新版本)定义的相异 (DISTINCT) 类型的概念十分相似,还与基于字符的大对象 (CLOB) 类型 varchar(max) 和 nvarchar(max) 十分相似。尽管 T-SQL INSERT 语句会自动将 VALUES 列表中使用的 varchar 值或 nvarchar 值转换为 xml(标准化越来越近了) 数据类型的列值,但必须在该数据类型与 varchar 类型或 nvarchar 类型间进行转换。您无法用 CAST 或 CONVERT 将 xml(标准化越来越近了) 类型转换为除 varchar 或 nvarchar 外的任何其他类型。xml(标准化越来越近了) 数据类型的两个实例无法进行比较。与 SQL-99 的相异类型类似,xml(标准化越来越近了) 类型有自己的方法;这些方法使您能够使用替代的查询语言 XQuery。xml(标准化越来越近了) 类型中的数据不遵循关系数据模型,但遵循 XQuery 1.0 和 XPath 2.0 数据模型。

使用 xml(标准化越来越近了) 数据类型的主要原因是,当定义一个 xml(标准化越来越近了) 数据类型列时,则将该列中的数据本身存储在数据库中。在该文件系统上,列不是一个指向 xml(标准化越来越近了) 文档的指针。这意味着,xml(标准化越来越近了) 数据被包含在备份和还原过程中,受常规的 sql server(WINDOWS平台上强大的数据库平台) 安全性保护,并参与事务和日志记录。尽管在关系型数据库内部存放 xml(标准化越来越近了) 数据可能会让一些关系模型的纯粹化论者不高兴,但这意味着基于管理、可靠性以及控制等原因而将数据存储在了单个库中。

下面是一个在表中使用 xml(标准化越来越近了) 类型的示例。该表以 xml(标准化越来越近了) 格式存储发票文档。

CREATE TABLE invoices (id  INTEGER IDENTITY Prima(最完善的虚拟主机管理系统)RY KEY,xml(标准化越来越近了)invoice xml(标准化越来越近了))

请注意,无法将 xml(标准化越来越近了) 列本身用作主键。这是因为无法直接比较 xml(标准化越来越近了) 数据类型的实例,尽管它们能包含 NULL 值(且能够测试是否为 NULL 值)。虽然不难对 xml(标准化越来越近了) 数据执行字符串比较,但是在数据级执行比较的难度将会增加一个数量级。例如,下面的两个 xml(标准化越来越近了) 文档在数据上等效,但在词法上却毫无等效性可言:

<!-- These two documents are equivalent --><doc1><row au_id="111-11-1111"/></doc1><doc1><row au_id='111-11-1111'></row></doc1>

可以将 xml(标准化越来越近了) 文档或 xml(标准化越来越近了) 片段存储在 xml(标准化越来越近了) 数据类型的一个实例中。xml(标准化越来越近了) 片段是遵循合式 xml(标准化越来越近了) 规则的数据实例,但不一定包含单个根元素。所谓合式,仅仅是指文档符合 xml(标准化越来越近了) 1.0 中定义的语法。

例如,T-SQL FOR xml(标准化越来越近了) 查询的输出是一个 xml(标准化越来越近了) 片段,但它没有根元素。既支持文档又支持片段,这与 XQuery 1.0 和 XPath 2.0 数据模型是一致的。无论如何,在 xml(标准化越来越近了) 数据类型中存储的数据必须合式。

由于 xml(标准化越来越近了) 数据类型遵循 xml(标准化越来越近了) XQuery 1.0 和 XPath 2.0 数据模型,所以它们不受关系约束限制,而受 xml(标准化越来越近了) 架构约束。除了将 xml(标准化越来越近了) 文档或片段存储在 xml(标准化越来越近了) 数据类型列中之外,还可以将 xml(标准化越来越近了) 数据类型列与 xml(标准化越来越近了) 架构相关联,用 sql server(WINDOWS平台上强大的数据库平台) 验证该列。因此,可以把能够包含文档或片段的 xml(标准化越来越近了) 数据类型想像为架构有效的 — 也就是说,遵循架构中定义的类型或者仅仅是合式。

xml(标准化越来越近了) 架构定义了存在于一个特殊的命名空间中的数据类型集。架构本身是合式的,且遵守一个称为“架构的架构”的架构。架构是有效的 xml(标准化越来越近了) 文档,正如关系表定义及其他数据定义语言 (DDL) 语句是有效的 T-SQL 一样。尽管对于一个特殊的命名空间可以有不止一个架构定义文档,但一个架构定义文档只能在一个命名空间中定义类型。XSD 定义了 xml(标准化越来越近了) 文档中被作为类型支持的基本类型的标准集,其方式与 SQL-99 标准定义关系型数据库必须支持的基本类型集的方式完全一样。

为了能够用与 xml(标准化越来越近了) 文档相应的架构验证 xml(标准化越来越近了) 文档,sql server(WINDOWS平台上强大的数据库平台) Yukon 把 xml(标准化越来越近了) 架构存储在数据库中。通过使用 CREATE xml(标准化越来越近了)SCHEMA DDL 语句,在 sql server(WINDOWS平台上强大的数据库平台) 引擎中对架构文档编目,如 图 4 中的代码所示。

通过引用 xml(标准化越来越近了) 架构的目标命名空间将 xml(标准化越来越近了) 架构从数据库中删除。例如,通过下面的语句可以删除我刚刚编目的架构:

DROP xml(标准化越来越近了)SCHEMA NAMESPACE 'http://example.org/People'

请注意,无论怎样配置数据库,命名空间都是区分大小写的。

xml(标准化越来越近了) 数据类型列、参数以及变量可以是有类型的也可以是无类型的 —— 也就是说,它们可能遵循也可能不遵循某个架构。要指定正在使用一个有类型的列(例如,图 4 里的 xml(标准化越来越近了) 列),要在圆括号里指定架构命名空间,如下所示:

CREATE TABLE xml(标准化越来越近了)_tab (the_id INTEGER,xml(标准化越来越近了)_col xml(标准化越来越近了)('http://example.org/People'))

由此,您便针对将哪些内容包含在组成该列的 xml(标准化越来越近了) 中定义了一系列的完整性约束。通过使用一个 xml(标准化越来越近了) 架构把列中的 xml(标准化越来越近了) 数据类型化不仅起到完整性约束的作用,而且也是对 sql server(WINDOWS平台上强大的数据库平台) XQuery 引擎的优化,这是因为在查询中使用了有类型的数据。而且,这还让 XQuery 引擎得以识别中间结果和最终结果的数据类型。如果 xml(标准化越来越近了) 数据不是强类型数据,则 XQuery 可以基于查询语法执行隐式类型转换(就像 T-SQL 在某些情况下所做的那样),或者将所有数据均视为字符串数据类型。

当将一个 xml(标准化越来越近了) 架构存储到 sql server(WINDOWS平台上强大的数据库平台) 中时,并不直接将其存储为 xml(标准化越来越近了) 文档。相反,而是将其分解为有助于优化架构验证的专有格式。一旦存储了 xml(标准化越来越近了) 架构,sql server(WINDOWS平台上强大的数据库平台) 就可以利用 xml(标准化越来越近了)_schema_namespace 函数对其大部分进行重构。不过,该函数不重构像批注和注释这样的项,因此您可能需要单独记取原始的架构文档。为了日后使用而完全原样地保留架构的副本,一个便捷的方法是,将其作为一个 varchar(max) 列存储在一个单独的表中。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

xml(标准化越来越近了) 索引

在 xml(标准化越来越近了) 列上创建索引的语法与创建一个 SQL 索引所用的语法类似:

CREATE xml(标准化越来越近了) INDEX xml(标准化越来越近了)_idxON xml(标准化越来越近了)_tab (xml(标准化越来越近了)_col)

尽管这看上去只是一个使用了额外的 xml(标准化越来越近了) 关键字的普通索引创建语句,但使用这一语句的实际效果与创建一个传统索引时所获得的效果大不相同。在 xml(标准化越来越近了) 列的情况下所创建的是为优化 XQuery 查询而不是 SQL 查询的列的内部表示上的索引。请记住,无法在 xml(标准化越来越近了) 列上使用 SQL 比较运算符。由于 xml(标准化越来越近了) 索引和 SQL 索引共享数据库中相同的值空间,因此无法使用相同的索引名创建一个 xml(标准化越来越近了) 索引和一个 SQL 索引。当然,还可以在 xml(标准化越来越近了) 类型列的内容上创建全文索引;这与 xml(标准化越来越近了) 索引无关。(有关全文搜索的细节超出了本文讨论的范围。)

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

xml(标准化越来越近了) 数据类型函数

除了能够将 xml(标准化越来越近了) 数据类型作为表或者视图中的列、变量或完整的参数来使用,xml(标准化越来越近了) 数据类型还包含多种类型特定的方法。可以使用 variable::method 语法来调用这些方法。这些 xml(标准化越来越近了) 类型函数具有几种不同的功能:为一个给定的 XQuery 路径表达式判断一个节点或者几个节点是否存在,以及通过 XQuery 查询和修改 xml(标准化越来越近了) 类型的值。

依定义,xml(标准化越来越近了) 数据类型是一种复杂类型 — 也就是说,是一个通常包含不止一个数据值的类型。可以用两种截然不同的方式使用 xml(标准化越来越近了) 数据类型列。第一种,可以使用 T-SQL 在其上查询数据并执行操作,就好像它是一个简单的数据类型一样。这类似于在文件系统中处理 xml(标准化越来越近了) 文件的方式;读取整个文件或写入整个文件。第二种,利用 XQuery 1.0 模型和 XPath 2.0 模型允许把具体数据公开为一系列的数据值或节点这一事实,可以在列中的 xml(标准化越来越近了) 数据上执行查询和操作。为此,需要一种 xml(标准化越来越近了) 查询语言。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

XQuery 1.0 — 一种 xml(标准化越来越近了) 查询语言

除 sql server(WINDOWS平台上强大的数据库平台) 查询函数外,Yukon 还支持一组专门为 xml(标准化越来越近了) 数据类型设计的原生 XQuery 函数。虽然 XQuery 看起来很像 SQL,但它专门为处理 xml(标准化越来越近了) 数据的半结构化特性而设计,包括强大的递归能力和节点导航。除 XPath 的查询能力外,XQuery 允许通过 XSLT 构造元素和属性。原生 XQuery 1.0 引擎以及 XPath 2.0 分析器与关系引擎并存于 Yukon 查询处理器之内。不同于 XPath 1.0,XQuery 1.0 和 XPath 2.0 是强类型查询语言。这一点通过种类繁多的构造函数和针对不同数据类型的转换函数就能可见一斑。之所以会这样,其背后的原因是,构建 XQuery 是为了优化以及使用强类型而非字符串。这使得查询引擎在优化和执行查询时性能更佳。设想一下,如果 sql server(WINDOWS平台上强大的数据库平台) 中的 T-SQL 查询分析器不得不把所有数据都以一种数据类型来处理会怎样!

xml(标准化越来越近了) 数据类型列、xml(标准化越来越近了) 变量以及 xml(标准化越来越近了) 过程参数可通过参考 xml(标准化越来越近了) 架构而成为强类型,当然它们也可以是无类型的。当在 XQuery 中使用有类型的 xml(标准化越来越近了) 时,查询分析器要处理更多的信息。如果使用无类型的 xml(标准化越来越近了),查询引擎必须从数据的每一部分都是字符串类型这一前提出发;内置的数据函数可以与强类型数据一起使用以返回正确的数据类型。

XQuery 支持静态类型分析,这意味着如果知道输入到表达式中的项的类型,那么就能在分析时推断出表达式的输出类型。另外,强类型允许 XQuery 语言在分析时基于类型对输入进行语法检查,就像 T-SQL 所能做的那样。这样便可以减少运行时的隐式类型转换。sql server(WINDOWS平台上强大的数据库平台) 支持直接在 xml(标准化越来越近了) 数据类型中进行 XQuery 。这通过三个 xml(标准化越来越近了) 数据类型方法来实现:

?

xml(标准化越来越近了)::exist 把 XQuery 作为输入,并根据查询是否返回一个空序列 (0)、一个至少有一个节点的序列 (1) 或者列为 NULL 分别返回 0、1 或者 NULL。

?

xml(标准化越来越近了)::value 把 XQuery 作为输入,并将 SQL 类型作为标量值返回。

?

xml(标准化越来越近了)::query 把 XQuery 作为输入,并将 xml(标准化越来越近了) 数据类型作为结果返回。

当前通过 sql server(WINDOWS平台上强大的数据库平台) Yukon 的预发布版本中的这些函数实现的 XQuery 的方言,基本上体现的是 2001 年 12 月版的 XQuery 规范。随着 sql server(WINDOWS平台上强大的数据库平台) Yukon 和 XQuery 规范即将投入使用,其语法将越来越符合当前所采用的规范。

尽管使用 XQuery 语言本身即可构造复杂文档,但唯有 xml(标准化越来越近了)::query 函数可以充分利用这一特性。当使用 xml(标准化越来越近了)::value 和 xml(标准化越来越近了)::exist 时,通常将创建简单的 XPath 2.0 表达式而不是使用序列、构造函数、格式信息等的复杂 XQuery。因为 xml(标准化越来越近了)::value 只能返回一个包含单一标量值的序列(它不能返回一个 xml(标准化越来越近了) 数据类型),而 xml(标准化越来越近了)::exist 用于检查存在性(返回布尔值)。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

使用 XQuery 函数

xml(标准化越来越近了)::exist 函数将搜索指定的 xml(标准化越来越近了) 列,查找与给定的 XQuery 表达式相匹配的数据。对于每一行,如果在指定列中包含匹配的数据,函数返回真 (1)。可将 xml(标准化越来越近了) 函数用于 xml(标准化越来越近了) 列上的检查约束中,作为 xml(标准化越来越近了) 架构约束的补充或取代 xml(标准化越来越近了) 架构约束。下面是一个示例:

-- pdoc must have a person element-- as a child of the people rootCREATE TABLE xml(标准化越来越近了)tab(id INTEGER Prima(最完善的虚拟主机管理系统)RY KEY,pdoc xml(标准化越来越近了) CHECK (pdoc::exist('/people/person')=1))

xml(标准化越来越近了)::value 函数把文本性的 XQuery 视为一个字符串并返回一个单一的标量值。将返回的 sql server(WINDOWS平台上强大的数据库平台) 类型的值指定为第二个参数,并将其强制转换为相应的数据类型。该数据类型可以是除 sql server(WINDOWS平台上强大的数据库平台) xml(标准化越来越近了) 数据类型、用户定义类型或者 sql server(WINDOWS平台上强大的数据库平台) 时间戳数据类型外的任何一种 sql server(WINDOWS平台上强大的数据库平台) 类型。

xml(标准化越来越近了)::value 函数必须返回单个标量值,否则将引发错误。无需让 xml(标准化越来越近了)::value 返回单个 xml(标准化越来越近了) 数据类型 — 这是由 xml(标准化越来越近了)::query 完成的。

如下使用一个简单的文档和几个表值

CREATE TABLE xml(标准化越来越近了)_tab(the_id INTEGER Prima(最完善的虚拟主机管理系统)RY KEY IDENTITY,xml(标准化越来越近了)_col xml(标准化越来越近了))GOINSERT xml(标准化越来越近了)_tab values('<people><person name="curly"/></people>')INSERT xml(标准化越来越近了)_tab values('<people><person name="larry"/></people>')INSERT xml(标准化越来越近了)_tab values('<people><person name="moe"/></people>')GO

下面使用 xml(标准化越来越近了)::value 的 SQL 查询将为每一行生成包含 ID 和名称的一行。

SELECT the_id,xml(标准化越来越近了)_col::value('/people/person/@name', 'varchar(50)') AS nameFROM xml(标准化越来越近了)_tab

结果如下:

 the_id      name--------  ------------------------1         curly2         larry3         moe

尽管 xml(标准化越来越近了) 数据类型的所有函数都调用内部查询处理器,但实际在 xml(标准化越来越近了) 数据类型的一个实例上执行完整 XQuery 的函数是 xml(标准化越来越近了):query。该函数将 XQuery 文本(简单或复杂,因需要而定)视为输入字符串并返回 xml(标准化越来越近了) 数据类型的一个实例。按照规范,其结果总是一个 XQuery 序列,除非 XQuery 实例为 NULL。如果输入实例为 NULL,则结果也为 NULL。可以将 xml(标准化越来越近了) 数据类型的结果实例作为一个 SQL 变量返回,并用作需要 xml(标准化越来越近了) 数据类型的 INSERT 语句的输入,或者可以将其作为一个存储过程的输出参数返回。

在 sql server(WINDOWS平台上强大的数据库平台) Yukon 中,请记住,xml(标准化越来越近了)::query 函数要引用一个特殊的列(或 xml(标准化越来越近了) 数据类型的实例),而且输入也将来自该列或者实例的数据 — 这就是环境文档。最简单的 XQuery 可以仅由 XPath 2.0 表达式组成。它将返回一个包含零个或更多个节点或者标量值的序列。假定使用前面的文档,一个简单的 XQuery

SELECT xml(标准化越来越近了)_col::query('/people/person') AS personsFROM xml(标准化越来越近了)_tab

将返回一个序列,包含每一行的一个节点:

persons-----------------------------------<person name="curly"/><person name="larry"/><person name="moe"/>

XQuery 不同于 XPath 之处在于,除了查询文档之外,它还可以利用通常所说的节点构造函数来编写一个文档。这与 XSLT 类似,不过实现上有所不同。图 5 包含一个从发票文档构造付款 xml(标准化越来越近了) 文档的示例。这里所用到的发票文档以及生成的付款文档包含在本文的下载代码中(请参见本文顶部的链接)。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

sql server(WINDOWS平台上强大的数据库平台) 中的 XQuery 扩展函数

由于 XQuery 引擎执行在关系型数据库环境中,因此 Yukon 为了在 XQuery 自身内部使用非 xml(标准化越来越近了) 数据(也就是关系型数据),提供了两个方便、标准的方法。扩展函数 sql:column 和 sql:variable 就是为这一目的所设。这两个函数使您得以从一个 XQuery 内部引用表中的关系列以及引用 T-SQL 变量。

这两个函数可用在任何可以使用 XQuery 的场合,也就是可以使用 xml(标准化越来越近了):exist、xml(标准化越来越近了)::value、xml(标准化越来越近了)::query 以及 xml(标准化越来越近了)::modify(将在本文后续部分中讲述)的场合。图 6 包含一个用户定义函数,用以返回一个特定的发票中所有标价过高的项目。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

xml(标准化越来越近了) DML — 更新 xml(标准化越来越近了)

XQuery 1.0 规范中没有规定就地改变 xml(标准化越来越近了) 实例或文档的 XQuery 语法的定义。尽管一些厂商在讨论一个“标准的标准扩展”,但目前还没有发布在 XQuery 规范中加入数据操作语言 (DML) 的计划。由于 Yukon 将把 XQuery 用作在服务器内部查询 xml(标准化越来越近了) 数据类型的原生机制,因此要求它必须拥有某种操作语言。另一种方案是,仅赋予用户将 xml(标准化越来越近了) 类型的实例作为一个完整实体替换的能力。因为对 xml(标准化越来越近了) 数据类型实例所做的更改将参与当前的事务环境,所以这相当于在 SQL 中使用 SELECT 和 INSERT 却没有相应的 UPDATE 语句。因此,Yukon 引入了 xml(标准化越来越近了) DML 的一种非标准实现。

也就是,使用 XQuery 样子的语法,结合 SQL 样子的扩展来实现 xml(标准化越来越近了) DML。这突出了这样一个事实,即在 sql server(WINDOWS平台上强大的数据库平台) 内部操作 xml(标准化越来越近了) 实例等效于操作一种复杂类型,或者更准确地说,一个复杂类型的图。可以通过在单个 xml(标准化越来越近了) 数据类型列、变量或过程参数上使用 xml(标准化越来越近了):modify 函数来调用 xml(标准化越来越近了) DML。可以在 SQL SET 语句环境中这样使用 xml(标准化越来越近了) DML:在一个 xml(标准化越来越近了) 数据类型列上使用 UPDATE...SET,或者在 xml(标准化越来越近了) 变量或参数上使用 SET。下面是 UPDATE...SET 语法的一个简单示例:

-- change the value of xml(标准化越来越近了) data type column instanceUPDATE some_tableSET xml(标准化越来越近了)_col::modify('some xml(标准化越来越近了) DML')WHERE id = 1-- change the value of an xml(标准化越来越近了) variableDECLARE @x xml(标准化越来越近了)-- initialize itSET @x = '<some>initial xml(标准化越来越近了)</some>'-- now, mutate itSET @x = @x::modify('some xml(标准化越来越近了) DML')

xml(标准化越来越近了)::modify 函数支持在一个 xml(标准化越来越近了) 类型的现有实例中对节点集执行插入、更新和删除操作。下面的示例演示在 Invoice 元素中插入第一个子元素 InvoiceDate :

SET @x::modify('{-- XQuery program --}namespace inv="urn:www-develop-com:invoices"insert <inv:InvoiceDate>2002-06-15</inv:InvoiceDate>as firstinto /inv:Invoice ')
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

FOR xml(标准化越来越近了) 和 Openxml(标准化越来越近了) 的增强功能

sql server(WINDOWS平台上强大的数据库平台) 2000 中的组合和分解功能在 Yukon 中得到了加强。尽管对 Openxml(标准化越来越近了) 的主要更改是对 xml(标准化越来越近了) 数据类型的支持(作为一个输出列并通过与其相关的 xml(标准化越来越近了) 分析存储过程 sp_xml(标准化越来越近了)_preparedocument 实现),但是 FOR xml(标准化越来越近了) 语法中包含了许多令人激动的增强功能。

sql server(WINDOWS平台上强大的数据库平台) 2000 在 T-SQL 中提供了一个增强功能,它允许使用对关系表的 SQL 查询来组合 xml(标准化越来越近了) 文档片断。FOR xml(标准化越来越近了) 查询有三种方言:FOR xml(标准化越来越近了) RAW、FOR xml(标准化越来越近了) AUTO、FOR xml(标准化越来越近了) EXPLICIT。FOR xml(标准化越来越近了) RAW 在结果中为每一行生成一个 xml(标准化越来越近了) 元素,而不管查询使用了多少个表。对应每一列都有一个属性,属性的名称体现了列的名称或别名。FOR xml(标准化越来越近了) RAW 已经在 Yukon 中得到了加强,以允许使用元素规范化形式的 xml(标准化越来越近了)。虽然 FOR xml(标准化越来越近了) AUTO 也在结果中为每一行生成一个 xml(标准化越来越近了) 元素,但如果查询使用了多个表,则生成嵌套的 xml(标准化越来越近了) 元素。嵌套的顺序由 SELECT 语句中列的顺序决定。FOR xml(标准化越来越近了) EXPLICIT 通过 SQL UNION 查询生成 xml(标准化越来越近了)。每个 SQL UNION 查询的分支生成一个不同层次的 xml(标准化越来越近了) 。这是到目前为止最灵活的语法,它可以完全根据需要来生成元素规范化形式的 xml(标准化越来越近了)、属性规范化形式的 xml(标准化越来越近了)和嵌套的 xml(标准化越来越近了)。这也是到目前为止最复杂的编程方言。

sql server(WINDOWS平台上强大的数据库平台) Yukon 为 FOR xml(标准化越来越近了) 查询提供了相当多的改进功能和增强功能:

?

FOR xml(标准化越来越近了) 可以生成 xml(标准化越来越近了) 类型的实例。

?

FOR xml(标准化越来越近了) AUTO 和 FOR xml(标准化越来越近了) RAW 能够用 XSD 架构格式的内联架构为 xml(标准化越来越近了) 结果加上前导。先前版本的 FOR xml(标准化越来越近了) 仅能为内联的 DTD 或 XDR (xml(标准化越来越近了) Data Reduced) 架构加上前导。

?

可以嵌套 FOR xml(标准化越来越近了) 查询。

?

可以使用 FOR xml(标准化越来越近了) RAW 生成以元素为中心的 xml(标准化越来越近了)

?

可以选择为 NULL 数据库值生成 xsi:nil,而不是将该元素完全丢弃在 xml(标准化越来越近了) 结果之外。

?

通过将空白字符作为实体编码,改进了对空白的处理。

?

对在 FOR xml(标准化越来越近了) AUTO 中确定嵌套的算法进行了细微改进。

这些增强功能中最让人感兴趣的是,FOR xml(标准化越来越近了) 可以生成 xml(标准化越来越近了) 数据类型的实例。该实例是一个 xml(标准化越来越近了) 片断,可以将其封装到根元素、返回给调用者、用 xml(标准化越来越近了) 数据类型函数查询或转变,或是存储在 xml(标准化越来越近了) 列中。下面的示例演示了使用 FOR xml(标准化越来越近了) 查询为 INSERT INTO 语句生成对一个表的输入:

-- create a tableCREATE TABLE xml(标准化越来越近了)_tab(id INT IDENTITY Prima(最完善的虚拟主机管理系统)RY KEY, xml(标准化越来越近了)_col xml(标准化越来越近了))-- populate it with a FOR xml(标准化越来越近了) queryDECLARE @x xml(标准化越来越近了)SET @x = (SELECT * FROM pubs.dbo.authors FOR xml(标准化越来越近了) AUTO)INSERT INTO xml(标准化越来越近了)_tab VALUES(@x)GO
新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

原生 Web 服务支持

Web 服务为使用标准协议和通用消息格式的通讯提供了一种标准机制。最常用的网络协议是 HTTP,并使用 SOAP 作为消息格式。任何能够生成基于 xml(标准化越来越近了) 样式的文本消息并通过 HTTP 协议发送这些消息的平台均可以生成和使用 xml(标准化越来越近了) Web 服务,这使它成为在不同系统之间进行通讯时最常采用的方法;而且随着时间的推移,有可能会取代专用协议。

sql server(WINDOWS平台上强大的数据库平台) 2000 允许使用 IIS 和 ISAPI DLL 来通过 HTTP 进行通讯。该 DLL 允许用户向一个已知的由基于 xml(标准化越来越近了) 的文件(称作模板)所公开的终结点发出 HTTP 请求(当然,要进行安全检查)。SQLxml(标准化越来越近了) Web Release 3.0 扩展了 ISAPI DLL 的功能,可以生成 SOAP 包,从而允许程序员通过 IIS 将 sql server(WINDOWS平台上强大的数据库平台) 以 Web 服务的形式公开。

任何存储过程、用户定义函数或模版查询都可以以 SOAP 终结点的形式公开。输出可以采用多种格式,其中一些针对基于 .NET 的使用者进行了优化,但所有格式均使用 SOAP 协议。ISAPI 应用程序也扩展为可以生成 Web 服务描述语言 (WSDL),这是一种 xml(标准化越来越近了) 的标准化方言,用于描述 Web 服务的格式和位置。它允许任何能够使用 WSDL 的程序均可同 sql server(WINDOWS平台上强大的数据库平台) 通讯。

如果您在 Windows Server? 2003 上安装了 sql server(WINDOWS平台上强大的数据库平台) Yukon,则可以获得更好的性能和功能,这是因为在操作系统级别上对 HTTP 处理程序进行了增强,包括在相同端口上从多个应用程序(如同时使用 sql server(WINDOWS平台上强大的数据库平台) 和 IIS)提供 HTTP 的能力。

这些新功能被直接内置到了 Yukon 中。不是将配置信息存储在注册表或 IIS 元数据库中,而是将这些信息存储在 sql server(WINDOWS平台上强大的数据库平台) 元数据中,这种数据可以用 T-SQL 来定义。有关的 DDL 语句是 CREATE HTTP ENDPOINT、ALTER HTTP ENDPOINT 以及 DELETE HTTP ENDPOINT。使用 HTTP ENDPOINT 语句,可以定义 HTTP 支持的所有属性,以及将存储过程和用户定义的函数定义为 Web 方法。还支持使用终结点进行即席 SQL 查询。图 7 中的示例演示了在允许进行即席查询的 pubs 数据库上定义终结点,并将 byroyalty 存储过程定义为一个 Web 方法。

新版本突显原生 xml<font class=reblank  style=(标准化越来越近了) 类型和高级数据处理的优势(图五)" />返回页首

总结

本文简要介绍了 sql server(WINDOWS平台上强大的数据库平台) Yukon 的预发布版对 xml(标准化越来越近了) 功能的增强。文中没有涉及客户端的增强,而仅介绍了实际对 sql server(WINDOWS平台上强大的数据库平台) 引擎的增强功能,同时本文也没有讲述 XQuery 的细节。尽管 SQL Workbench 附带一个图形化的 XQuery 工具帮助您入门,但要了解这些,还需要阅读另外一两篇文章。我希望本文能激发您亲身体验 Yukon 对 xml(标准化越来越近了) 支持的欲望。

Bob Beauchemin 即是讲师又是课程作家和 DevelopMentor 的数据库教材研究课程联络人。他撰写的文章涵盖 ADO.NET、OLE DB 和 sql server(WINDOWS平台上强大的数据库平台)。Bob 是 Essential ADO.NET 一书 (Addison-Wesley, 2002) 的作者,还是即将出版的 A First Look at Microsoft sql server(WINDOWS平台上强大的数据库平台) "Yukon" Beta for Developers 的合著者,本文即节选自该书。

1 2 3 4 5 6  下一页

Tags: 突显 原生

编辑录入:coldstar [复制链接] [打 印]
赞助商链接