MS SQL SERVER2005 XML 最佳实践

来源:互联网 发布:重庆软件行业工资 编辑:程序博客网 时间:2024/05/16 17:38
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
SQL SERVER 2005 为 XML 数据处理提供了广泛支持。可以将 XML 值以本机方式存储在 XML 数据类型列中,后者可以根据 XML 架构的集合进行类型化,也可以保持非类型化状态。可以对 XML 列创建索引。此外,通过使用 XQuery 和 XML DML 可支持精细的数据操作。XML DML 是针对数据修改的扩展。

SQL SERVER 2000 和 SQLXML Web 版本提供了强大的 XML 数据管理功能。这些功能着重于关系数据和 XML 数据之间的映射。可以使用带批注的 XSD (AXSD) 来定义关系数据的 XML 视图,以提供以 XML 为中心的方法,该方法支持对 XML 数据执行大容量数据加载、查询和更新功能。Transact-SQL 扩展提供了一个以 SQL 为中心的方法,以便使用 FOR XML 将关系查询结果映射到 XML,以及使用 OPENXMLXML 生成关系视图。这些支持已在 SQL SERVER 2005 中进行了扩展。结合新添加的本机 XML 支持,SQL SERVER 2005 提供了一个强大的平台,以针对半结构化和非结构化数据管理开发功能丰富的应用程序。

本主题提供了 SQL SERVER 2005 中的 XML 数据建模和使用准则,包含下列两个部分:

数据建模

可以通过使用本机 XML 数据类型和拆分到表中的 XML,以多种方式在 SQL SERVER 2005 中存储 XML 数据。本主题提供了为对 XML 数据进行建模做出适当选择的准则。另外,还介绍了对 XML 数据创建索引、属性提升和 XML 实例的类型化。


使用

本部分讨论了与使用相关的主题,例如将 XML 数据加载到服务器和查询编译中的类型推理。本部分还解释和区分了密切相关的功能,并就如何适当使用这些功能提出了建议。这些均通过示例进行了说明。


数据建模
本部分概述了应使用 SQL SERVER 2005 中的 XML 功能的理由,另外还提供了在本机 XML 存储和 XML 视图技术之间进行选择的准则,并给出了数据建模建议。

关系或 XML 数据模型
如果您的数据是高度结构化的,具有已知架构,则对于数据存储,关系模型可能最适用。SQL SERVER 提供了您可能需要的必要功能和工具。另一方面,如果结构是半结构化或非结构化的或者未知的,则必须考虑对这类数据进行建模。

如果您需要一个与平台无关的模型,以便通过使用结构和语义标记来确保数据的可移植性,则 XML 是一个不错的选择。此外,下列情况下,适于做此选择:

您的数据为稀疏数据,或您不了解数据的结构,或数据结构将来可能会有重大变化。


您的数据体现的是包容层次结构而不是在实体间的引用,并且可能是递归数据。


您的数据本身具有顺序性。


您希望基于数据的结构查询数据或更新部分数据。


如果上述条件均不满足,则应使用关系数据模型。例如,如果数据为 XML 格式,但应用程序只是使用数据库来存储和检索数据,则只需要 [n]varchar(max) 列。将数据存储在 XML 列中还有其他好处,包括让引擎确定数据格式是否正确或有效,以及支持对 XML 数据进行精细查询和更新。

SQL SERVER 2005 中存储 XML 数据的理由
下面是一些使用 SQL SERVER 2005 中的本机 XML 功能而不是在文件系统中管理 XML 数据的理由:

您希望以一种高效的事务处理方式来共享、查询和修改 XML 数据。精细的数据访问对于您的应用程序而言很重要。例如,您可能需要提取 XML 文档中的某些部分,或者您可能需要插入新的部分而不是替换整个文档。


您有关系数据和 XML 数据,希望在应用程序中进行关系数据和 XML 数据之间的互操作。


您需要语言支持,以便对于跨域应用程序可以进行查询和数据修改。


您希望服务器能够保证数据格式正确,并能够视情况根据 XML 架构来验证您的数据。


您希望对 XML 数据创建索引以实现高效的查询处理和良好的可伸缩性,并使用一流查询优化器。


您希望对 XML 数据进行 SOAP、ADO.NET 和 OLE DB 访问。


您希望使用数据库服务器的管理功能来管理 XML 数据。例如,这可能是备份、恢复和复制。


如果上述条件均不满足,最好将数据存储为非 XML 大型对象类型,如 [n]varchar(max) 或 varbinary(max)。

XML 存储选项
SQL SERVER 2005 中的 XML 存储选项包括:

采用 XML 数据类型的本机存储

数据以保留数据的 XML 内容的内部表示形式进行存储,XML 内容包括包容层次结构、文档顺序、元素和属性值等。具体来说,就是保留 XML 数据的 InfoSet 内容。有关 InfoSet 的详细信息,请访问 http://www.w3.org/TR/XML-infoset。InfoSet 内容并不是文本 XML 的精确副本,因为其中未保留下列信息:无关紧要的空格、属性顺序、命名空间前缀和 XML 声明。

对于类型化的 XML 数据类型(即绑定到 XML 架构的 XML 数据类型),后架构验证 InfoSet (PSVI) 将类型信息添加到 InfoSet,并以内部表示形式进行编码。这会显著提高分析速度。有关详细信息,请参阅 http://www.w3.org/TR/XMLschema-1 和 http://www.w3.org/TR/XMLschema-2 上的 W3C XML 架构规范。


XML 和关系存储之间映射

通过使用带批注的架构 (AXSD),将 XML 分解到一个或多个表中的列。这可保留在关系级别上的数据保真度。因此,尽管忽略了元素间的顺序,但仍保留了层次结构。架构不能是递归的。


大型对象存储 [n]varchar(max) 和 varbinary(max)

存储数据的精确副本。这对于特殊用途的应用(如法律文档)很有用。大多数应用不需要完全相同的副本,且 XML 内容(InfoSet 保真度)即可满足需要。


通常,您必须结合使用这些方法。例如,您可能需要将 XML 数据存储在 XML 数据类型列中,并将其中的属性提升到关系列中。或者,您可能需要使用映射技术将非递归部分存储到非 XML 列中,而只将递归部分存储在 XML 数据类型列中。

XML 技术的选择
XML 技术(本机 XMLXML 视图)的选择通常取决于下列因素:

存储选项

您的 XML 数据可能更适于大型对象存储(例如,产品手册),或更适于存储在关系列中(例如,转换为 XML 的行项)。每个存储选项都在不同程度上保留文档保真度。


查询功能

您可能会发现,基于查询的特性和对 XML 数据进行查询的程度,某一个存储选项比其他选项更合适。在两个存储选项中,对 XML 数据的精细查询(例如,XML 节点上的谓词评估)得到不同程度的支持。


XML 数据创建索引

您可能希望对 XML 数据创建索引以提高 XML 查询的性能。索引选项随存储选项的不同而不同,您必须做出适当的选择才能优化工作负荷。


数据修改功能

某些工作负荷涉及对 XML 数据进行精细修改。例如,在文档中添加新的部分,而其他工作负荷(如 Web 内容)则不涉及。对于您的应用程序来说,数据修改语言支持可能很重要。


架构支持

您的 XML 数据可通过架构进行说明,该架构可能是 XML 架构文档,也可能不是。对架构绑定的 XML 的支持取决于 XML 技术。


此外,不同的选择具有不同的性能特征。

本机 XML 存储
您可以将 XML 数据存储在服务器上的 XML 数据类型列中。下列情况下,适于做此选择:

您希望使用一种简单的方法将 XML 数据存储在服务器上,同时保留文档顺序和文档结构。


您可能有对应于您的 XML 数据的架构,也可能没有。


您希望查询和修改 XML 数据。


您希望对 XML 数据创建索引,以提高查询处理的速度。


您的应用程序需要系统目录视图以管理您的 XML 数据和 XML 架构。


如果您的 XML 文档具有多种结构,或您的 XML 文档符合不同的或复杂的架构,而这些架构很难映射到关系结构,本机 XML 存储很有用。

示例:使用 XML 数据类型对 XML 数据进行建模
例如有一个 XML 格式的产品手册,其中每个主题对应单独的一章,而每章中又包含多节。一节可以包含多个小节。因此,<section> 是一个递归元素。产品手册包含大量混合内容、关系图和技术材料;数据是半结构化的。用户可能希望对感兴趣的主题执行上下文搜索,例如,在有关“索引”的章中搜索有关“聚集索引”的节,并查询技术数量。

适于您的 XML 文档的存储模型是 XML 数据类型列。这可保留 XML 数据的 InfoSet 内容。对 XML 列创建索引有利于提高查询性能。

示例:保留 XML 数据的精确副本
为了进行说明,假定政府条例要求您保留 XML 文档的精确文本副本。例如,这些文档可能为签署的文档、法律文档或股票交易单。您可能希望将文档存储在 [n]varchar(max) 列中。

查询时,先在运行时将数据转换为 XML 数据类型,然后对其执行 Xquery。运行时转换开销可能很高,尤其是在文档较大的情况下。如果经常查询,可以采取冗余方式将文档存储在 XML 数据类型列中,并对其创建索引,同时从 [n]varchar(max) 列中返回精确的文档副本。

XML 列可以是基于 [n]varchar(max) 列的计算列。但不能对 XML 计算列创建 XML 索引,也不能对 [n]varchar(max) 或 varbinary(max) 列创建 XML 索引。

XML 视图技术
通过定义 XML 架构和数据库中的表之间的映射,可以创建持久性数据的“XML 视图”。通过 XML 视图,可使用 XML 大容量加载来填充基础表。您可以使用 XPath 1.0 版来查询 XML 视图;这种查询将被转换为针对表的 SQL 查询。与此类似,更新也会被传播到那些表。

在下列情况下,此技术很有用:

您希望拥有以 XML 为中心的编程模型,该模型使用现有关系数据上的 XML 视图。


您有对应于您的 XML 数据的架构(XSD、XDR),该架构可能由外部伙伴提供。


数据中的顺序并不重要,或查询表数据不是递归的,或事先已知最大递归深度。


您希望使用 XPath 1.0 版通过 XML 视图查询和修改数据。


您希望通过 XML 视图来大容量加载 XML 数据,并将其分解到基础表。


相关示例包括显示为用于数据交换和 Web 服务的 XML 的关系数据。有关详细信息,请参阅 MSDN Online Library。

示例:使用带批注的 XML 架构 (AXSD) 对数据进行建模
为了进行说明,假定您具有希望将其作为 XML 处理的关系数据(如客户、订单和行项)。请使用 AXSD 在关系数据上定义 XML 视图。通过使用 XML 视图可以将 XML 数据大容量加载到表,以及使用 XML 视图查询和更新关系数据。如果必须在 SQL 应用程序不间断工作时与其他应用程序交换包含 XML 标记的数据,该模型很有用。

混合模型
通常,对于数据建模,适于结合使用关系列和 XML 数据类型列。可以将 XML 数据中的某些值存储在关系列中,而将其余或全部 XML 值存储在 XML 列中。这可获得更好的性能,您可以更好地控制对关系列创建的索引和锁定特征。

要存储在关系列中的值取决于您的工作负荷。例如,如果基于路径表达式 /Customer/@CustId 检索所有 XML 值,则将 CustId 属性的值提升到关系列并对其创建索引可以获得更快的查询性能。另一方面,如果您的 XML 数据是以非冗余方式广泛地分解为关系列中,则重新汇集的开销可能很大。

对于高度结构化的 XML 数据,例如,表的内容已转换为 XML,您可以将所有值映射到关系列,并且可能使用 XML 视图技术。

使用 XML 数据类型进行数据建模
本部分讨论有关本机 XML 存储的数据建模主题,包括对 XML 数据创建索引、属性提升和类型化的 XML 数据类型。

相同或不同的表
可以在包含其他关系列的表中,或在与主表具有外键关系的单独表中创建 XML 数据类型列。

如果满足下列条件之一,请在同一个表中创建 XML 数据类型列:

您的应用程序对 XML 列执行数据检索,并且不需要 XML 列的 XML 索引。


您希望对 XML 数据类型列生成 XML 索引,并且主表的主键与其聚集键相同。有关详细信息,请参阅“对 XML 数据类型列创建索引”。


如果满足下列条件,请在单独的表中创建 XML 数据类型列:

您希望对 XML 数据类型列生成 XML 索引,但主表的主键与其聚集键不同,或主表没有主键,或主表是一个堆(即没有聚集键)。如果主表已存在,可能会这样。


您不希望因为表中存在 XML 列而降低表扫描的速度。无论该列是存储在行内还是行外,都会占用空间。


XML 数据的粒度
XML 列中存储的 XML 数据的粒度对锁定至关重要,在一定程度上,对更新也很重要。SQL SERVERXML 数据和非 XML 数据都使用相同的锁定机制。因此,行级锁定会导致锁定行中的所有 XML 实例。当粒度较大时,锁定大型 XML 实例以便进行更新会导致多用户情况下的吞吐量下降。另一方面,过度分解会丢失对象封装,并增加重新汇集开销。

对于良好的设计而言,重要的是保持数据建模要求与锁定和更新特征之间的平衡。但在 SQL SERVER 2005 中,实际存储的 XML 实例的大小并不十分重要。

例如,通过使用对部分二进制大型对象 (BLOB) 和部分索引更新(将存储的现有 XML 实例与其更新后的版本进行比较)的新支持,对 XML 实例进行更新。部分二进制大型对象 (BLOB) 更新在两个 XML 实例之间执行差异比较,并只更新差异之处。部分索引更新只修改那些必须在 XML 索引中更改的行。

非类型化、类型化和约束的 XML 数据类型
SQL SERVER 2005 XML 数据类型实现了 ISO SQL-2003 标准 XML 数据类型。因此,它可以在非类型化的 XML 列中存储格式正确的 XML 1.0 版的文档、具有文本节点和任意数量顶级元素的所谓的 XML 内容片段。系统将检查数据格式是否正确,但不要求将列绑定到 XML 架构,并且拒绝在扩展意义上格式不正确的数据。对于非类型化的 XML 变量和参数也是如此。

如果您有说明 XML 数据的 XML 架构,则可以将架构与 XML 列相关联以产生类型化的 XMLXML 架构用于验证数据,在编译查询和数据修改语句过程中执行比非类型化的 XML 更精确的类型检查,以及优化存储和查询处理。

在下列情况下,请使用非类型化的 XML 数据类型:

您没有对应于您的 XML 数据的架构。


您有架构,但不希望服务器验证数据。当应用程序在将数据存储到服务器之前执行客户端验证时,或临时存储根据架构确定无效的 XML 数据时,或在服务器上使用不受支持的架构组件(如 key/keyref)时,有时会出现这种情况。


在下列情况下,请使用类型化的 XML 数据类型:

您有对应于您的 XML 数据的架构,并且希望服务器根据 XML 架构验证 XML 数据。


您希望充分利用基于类型信息的存储和查询优化。


您希望在编译查询过程中更好地充分利用类型信息。


类型化的 XML 列、参数和变量可以存储 XML 文档或内容。但是,必须使用标志指定在声明时是存储文档还是存储内容。此外,必须提供 XML 架构集合。如果每个 XML 实例都刚好有一个顶级元素,请指定 DOCUMENT。否则,请使用 CONTENT。查询编译器在编译查询过程中的类型检查中使用 DOCUMENT 标志以推断单一的顶级元素。

除了对 XML 列进行类型化之外,还可以对类型化或非类型化的 XML 数据类型列使用关系(列或行)约束。在下列情况下,请使用约束:

无法在 XML 架构中表达业务规则。例如,花店的交货地址必须在其营业地点周围 50 英里之内。这可以编写为 XML 列的约束。约束可能涉及 XML 数据类型方法。


您的约束涉及表中的其他 XML 列或非 XML 列。例如,强制使 XML 实例中的客户 ID (/Customer/@CustId) 与 CustomerID 关系列中的值匹配。


文档类型定义 (DTD)
可以使用 XML 架构来对 XML 数据类型列、变量和参数进行类型化,但不能使用 DTD 进行此项操作。但是,内联 DTD 既可用于非类型化的 XML,也可用于类型化的 XML,以便提供默认值,并将实体引用替换为其扩展形式。

可以通过使用第三方工具将 DTD 转换为 XML 架构文档,然后将 XML 架构加载到数据库中。

XML 数据类型列创建索引
可以对 XML 数据类型列创建 XML 索引。它将对列中 XML 实例的所有标记、值和路径进行索引,从而提高查询性能。在下列情况下,您的应用程序可以从 XML 索引中获益:

XML 列进行查询在您的工作负荷中很常见。必须考虑数据修改过程中的 XML 索引维护开销。


XML 值相对较大,而检索的部分相对较小。生成索引避免了在运行时分析所有数据,并且索引查找有利于进行高效的查询处理。


XML 列的第一个索引是主 XML 索引。使用它时,可以对 XML 列创建三种类型的辅助 XML 索引,以提供常见种类的查询的速度,如以下部分所述。

XML 索引
这将对 XML 列中 XML 实例的所有标记、值和路径进行索引。基表(即包含 XML 列的表)的主键必须具有聚集索引。主键用于将索引行与基表中的行相关联。可从 XML 列中检索完整的 XML 实例,例如 SELECT *。查询使用主 XML 索引,并通过使用索引本身返回标量值或 XML 子树。

示例:创建主 XML 索引
在大多数示例中,使用包含非类型化的 XML 列的表 T (pk INT PRIMARY KEY, xCol XML)。可以采用简单的方式将这些示例扩展为类型化的 XML。有关如何使用类型化的 XML 的详细信息,请参阅 XML 数据类型。为简化起见,针对 XML 数据实例说明了查询,如下所示:

  复制代码
<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2">   <title>Writing Secure Code</title>   <author>      <first-name>Michael</first-name>      <last-name>Howard</last-name>   </author>   <author>      <first-name>David</first-name>      <last-name>LeBlanc</last-name>   </author>   <price>39.99</price></book>
 

以下语句对表 T 的 XML 列 xCol 创建 XML 索引(名为 idx_xCol):

  复制代码
CREATE PRIMARY XML INDEX idx_xCol on T (xCol)
 

辅助 XML 索引
创建了主 XML 索引之后,您可能希望创建辅助 XML 索引来提高工作负荷中不同种类查询的速度。三种类型的辅助 XML 索引(即 PATH、PROPERTY 和 VALUE)分别用于优化基于路径的查询、自定义属性管理方案和基于值的查询。PATH 索引功能是按文档顺序对列中的所有 XML 实例生成各个 XML 节点的 (path, value) 对的 B+ 树。PROPERTY 索引功能是创建各个 XML 实例中 (PK, path, value) 对的聚集 B+ 树,其中 PK 是基表的主键。最后,VALUE 索引功能是按文档顺序对 XML 列中的所有 XML 实例创建每个节点的 (value, path) 对的 B+ 树。

下面是创建一个或多个这些索引的一些准则:

如果工作负荷对 XML 列大量使用路径表达式,则 PATH 辅助 XML 索引可能会提高工作负荷的处理速度。最常见的情况是在 Transact-SQL 的 WHERE 子句中对 XML 列使用 exist() 方法。


如果工作负荷通过使用路径表达式从单个 XML 实例中检索多个值,则在 PROPERTY 索引中聚集各个 XML 实例中的路径可能会很有用。这种情况通常出现在属性包方案中,此时提取对象的属性并且已知其主键值。


如果工作负荷涉及查询 XML 实例中的值,但不知道包含那些值的元素名称或属性名称,则您可能希望创建 VALUE 索引。这通常出现在 descendant 轴查找中,例如 //author[last-name="Howard"],其中 <author> 元素可以出现在层次结构的任何级别上。这种情况也出现在通配符查询中,例如 /book [@* = "novel"],其中查询将查找具有某个值为“novel”的属性的 <book> 元素。


示例:基于路径的查找
为了进行说明,假定以下查询在您的工作负荷中很常见:

  复制代码
SELECT pk, xColFROM   TWHERE  xCol.exist ('/book/@genre[.="novel"]') = 1
 

路径表达式 /book/@genre 和值“novel”对应于 PATH 索引的键字段。因此,PATH 类型的辅助 XML 索引对此工作负荷很有用:

  复制代码
CREATE XML INDEX idx_xCol_Path on T (xCol)   USING XML INDEX idx_xCol FOR PATH
 

示例:提取对象的属性
例如,下面的查询从表 T 中的各行检索书的属性 genre、title 和 ISBN:

  复制代码
SELECT xCol.value ('(/book/@genre)[1]', 'varchar(50)'),    xCol.value ('(/book/title/text())[1]', 'varchar(50)'),    xCol.value ('(/book/@ISBN)[1]', 'varchar(50)')FROM    T
 

在这种情况下,属性索引很有用,其创建方式如下:

  复制代码
CREATE XML INDEX idx_xCol_Property on T (xCol)   USING XML INDEX idx_xCol FOR PROPERTY
 

示例:基于值的查询
在下面的查询中,descendant-or-self (//) 指定部分路径,以便基于 ISBN 值的查找从 VALUE 索引的使用中获益。

  复制代码
SELECT xColFROM    TWHERE    xCol.exist ('//book/@ISBN[. = "0-7356-1588-2"]') = 1
 

VALUE 索引的创建方式如下:

  复制代码
CREATE XML INDEX idx_xCol_Value on T (xCol)   USING XML INDEX idx_xCol FOR VALUE
 

XML 列的全文索引
您可以对 XML 列创建一个全文索引,该索引对 XML 值的内容进行索引,但忽略 XML 标记。属性值不在全文索引范围内,因为它们被视为标记的一部分,并且元素标记被用作标记边界。如有可能,可以按下列方式将全文搜索和 XML 索引结合起来:

首先,使用 SQL 全文搜索筛选感兴趣的 XML 值。


然后,查询那些使用 XML 列的 XML 索引的 XML 值。


示例:将全文搜索和 XML 查询结合起来
XML 列创建了全文索引后,下面的查询将检查 XML 值是否在书的标题中包含“custom”一词:

  复制代码
SELECT * FROM   T WHERE  CONTAINS(xCol,'custom') AND    xCol.exist('/book/title/text()[contains(.,"custom")]') =1
 

contains() 方法使用全文索引来将文档中任何位置包含“custom”一词的 XML 值组合为一个子集。exist() 子句确保“custom”一词出现在书的标题中。

使用 contains() 的全文搜索与 XQuery contains() 具有不同语义。后者是子字符串匹配,前者是使用词干匹配的标记匹配。因此,如果搜索标题中包含“run”的字符串,则匹配结果将包括“run”、“runs”和“running”,因为同时满足全文 contains() 和 Xquery contains()。但是,查询不匹配标题中的“customizable”一词,因为全文 contains() 失败,而满足 Xquery contains()。通常,对于纯子字符串匹配,应删除全文 contains() 子句。

此外,全文搜索使用词干匹配,而 XQuery contains() 是文字匹配。这一区别在下一个示例中进行说明。

示例:使用词干匹配对 XML 值进行全文搜索
通常不能消除上一个示例中执行的 XQuery contains() 检查。请看下面的查询:

  复制代码
SELECT * FROM   T WHERE  CONTAINS(xCol,'run')
 

因为使用了词干匹配,所以文档中的“ran”一词匹配搜索条件。此外,不通过使用 XQuery 来检查搜索上下文。

当通过使用 AXSD 将 XML 分解为全文索引的关系列时,对 XML 视图执行的 XPath 查询不对基础表执行全文搜索。

属性提升
如果主要是对少数元素和属性值进行查询,您可能希望将那些数量提升到关系列。检索整个 XML 实例,但只对一小部分 XML 数据进行查询时,这很有用。不必对 XML 列创建 XML 索引。但可以对提升的列创建索引。必须编写查询来使用提升的列。也就是说,查询优化器不会将对 XML 列的查询再定向到提升的列。

提升的列可以是同一个表中的计算列,也可以是表中用户维护的单独列。从每个 XML 实例提升单一值时,这就足够了。但是,对于多值属性,则必须为属性创建单独的表,如以下部分所述。

基于 XML 数据类型的计算列
可以使用调用 XML 数据类型方法的用户定义函数来创建计算列。计算列的类型可以是任何 SQL 类型,包括 XML。下面的示例说明了这一点。

示例:基于 XML 数据类型方法的计算列
为书的 ISBN 号创建用户定义函数:

  复制代码
CREATE FUNCTION udf_get_book_ISBN (@xData XML)RETURNS varchar(20)BEGIN   DECLARE @ISBN   varchar(20)   SELECT @ISBN = @xData.value('/book[1]/@ISBN', 'varchar(20)')   RETURN @ISBN END
 

在表中为 ISBN 添加计算列:

  复制代码
ALTER TABLE      TADD   ISBN AS dbo.udf_get_book_ISBN(xCol)
 

可以按通常的方式对计算列创建索引。

示例:对基于 XML 数据类型方法的计算列的查询
若要获得其 ISBN 为 0-7356-1588-2 的 <book>:

  复制代码
SELECT xColFROM   TWHERE  xCol.exist('/book/@ISBN[. = "0-7356-1588-2"]') = 1
 

可以重新编写对 XML 列的查询以使用计算列,如下所示:共3页: 上一页 1 [2] [3] 下一页 <script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击