📄 11398.htm
字号:
<link href="./dzs_cs.css" rel="stylesheet" type="text/css" /><table width="96%" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td> </td> </tr> <tr> <td height="24" align="center" valign="bottom" class="d_font3">Microsoft SQL Server 2005 中的 XML 支持</td> </tr> <tr> <td height="3" bgcolor="#E3E3E3"></td> </tr> <tr> <td> </td> </tr> <tr> <td class="d_font4"><STRONG>一、简介</STRONG>
<P>可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用。它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的。数据交换已成为 XML 技术的主要驱动力之一。.</P>
<P>XML 在企业应用程序中的使用正日益广泛,它主要用于对半结构化和非结构化数据进行建模。文档管理就是这样的一种应用程序。像电子邮件这样的文档是半结构化性质的。如果文档以 XML 的形式存储在数据库服务器中,就可以开发功能强大的应用程序来根据文档内容检索文档、查询部分内容(例如查找标题包含单词“背景”的部分),以及查询文档聚合。如果存在能够生成和使用 XML 的应用程序,则这样的方案就变得可行了。例如,Microsoft Office 2003 系统允许用户以 XML 标记的形式生成 Word、Excel、Visio 和 Infopath 文档。 </P>
<H3>为什么使用关系数据库来存储 XML 数据?</H3>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>将 XML 数据存储在关系数据库中会给数据管理和查询处理带来好处。SQL Server 提供了强大的查询和修改关系数据的能力,而且已经扩展到查询和修改 XML 数据。这使得可以利用在过去的版本上所进行的投资,就如同基于成本的优化和数据存储领域一样。例如,关系数据库中的索引技术已经广为人知,而且已经扩展到用于索引 XML 数据,这样就可以使用基于成本的决策来优化查询。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>XML 数据可以与现有的关系数据和 SQL 应用程序进行互操作,这样就可以在需要进行数据建模而又不破坏现有的应用程序的系统中引入 XML。数据库服务器还提供了管理功能来管理 XML 数据(例如备份、恢复和复制)。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>这些功能促进了对 SQL Server 2005 中的原生 XML 支持的需求,从而解决了不断增加的 XML 使用的问题。SQL Server 2005 中的 XML 支持将给企业应用程序开发带来好处。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>下面几部分将概述 SQL Server 2000 和 2005 中的 XML 支持,描述一些推动 XML 使用的方案,并且详细讨论服务器端和客户端的 XML 功能集。 </P></TD></TR></TBODY></TABLE>
<H3>SQL Server 2000 中的 XML 支持</H3>
<P>这一部分简要概述了 SQL Server 2000 中的 XML 支持,以及随后发布的 SQLXML 客户端编程平台 Web 版,它提供了丰富的支持来将关系数据映射到 XML 数据或将 XML 数据映射到关系数据。 </P>
<H4>服务器端支持</H4>
<P>在服务器上,XML 数据可以从表生成,并通过在 SELECT 语句中使用 FOR XML 子句来查询结果。这对于数据交换和 Web 服务应用程序是很理想的。FOR XML 的逆函数是一个名为 OpenXML 的关系行集合生成器函数;它通过求 XPath 1.0 表达式的值来从 XML 数据提取值,并将其放到行集合的列中。应用程序使用 OpenXML 来“切碎”传入 XML 数据,并将其存放到表中,或者用于通过 T-SQL 语言进行的查询。</P>
<H4>客户端支持</H4>
<P>SQL Server 2000 对客户端编程的支持称为 <A href="http://msdn.microsoft.com/library/en-us/dnanchor/html/anch_sqlxml.asp" target=_blank>SQLXML</A>。这项技术的核心是 XML 视图,它是 XML 架构和关系表之间的双向映射。SQL Server 2000 只支持 XDR 架构的映射,尽管在后续的 Web 版中增加了对 XSD 的支持。XML 视图允许使用 XPath 1.0 的一个子集来进行查询,其中,可以使用映射将路径表达式转换成底层表中的 SQL 查询,并且将查询结果打包成 XML 结果。 </P>
<P>SQLXML 还支持您创建 XML 模板,这使得您可以创建带有动态部分的 XML 文档。在 XML 文档中,您可以嵌入 FOR XML 查询和/或映射查询之上的 XPath 1.0 表达式。在执行 XML 模板时,可以用查询的结果来替换查询块。通过这种方式,您可以创建带有某些静态内容和某些数据驱动的动态内容的 XML 文档。</P>
<P>在SQL Server 2000 中,有两种访问 SQLXML 功能的主要方法: </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P><B>SQLXMLOLEDB Provider</B>。SQLXMLOLEDB Provider 是一个 OLE DB 提供程序,它通过 ADO 公开 Microsoft SQLXML 功能。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P><B>HTTP </B><B>访问</B>。SQL Server 2000 中的 SQLXML 功能也可以使用 SQLXML ISAPI 过滤器通过 HTTP 进行访问。通过使用我们的配置工具,您可以建立网站来检索传入请求,从而通过 HTTP 执行 XML 模板、XML 视图之上的 FOR XML 和 XPath 1.0 语句。 </P></TD></TR></TBODY></TABLE>
<H4>XML 支持的局限性</H4>
<P>服务器和客户端编程平台为基于表格和 XML 数据之间的映射生成和使用 XML 数据提供了丰富的支持。这能够相当好地处理结构化 XML 数据。在 SQLXML 中,查询语言是 XPath 1.0 的一个子集,并且有一些局限性。例如,不支持 descendant-or-self 轴 (//)。因此,在开发某些解决方案时会存在一定的限制。例如,不保存 XML 文档顺序,而这对于像文档管理这样的应用程序来说是非常关键的。此外,还不支持递归的 XML 架构。尽管存在这样一些局限性,但是客户端 SQLXML 和服务器 XML 功能还是在应用程序开发中得到了广泛的使用。SQL Server 2005 解决了许多这样的限制,扩展了关系 XML 交换功能,并且还提供了原生 XML 支持。</P>
<H3>SQL Server 2005 中的 XML 支持概述</H3>
<P>这一部分简要概述了 SQL Server 2005 中增加的新的 XML 支持,它是通过.NET 框架 V2.0 中的支持和本机客户端数据访问(如 OLE DB)进行补充的。</P>
<H4>XML 数据类型</H4>
<P>XML 数据模型具有一些特性,这些特性使得映射到关系数据模型非常困难,如果不是完全不可能的话。XML 数据具有可以递归的层次结构;关系数据库提供对层次数据(建模为外键关系)的弱支持。文档顺序是 XML 实例的固有属性,并且必须保存在查询结果中。这与关系数据形成了对比,关系数据是无序的,必须通过附加的排序列来强制进行排序。在查询时重新组合结果是很费力的,因为实际的 XML 架构将 XML 数据分解到大量的表中。 </P>
<P>SQL Server 2005 引入了一种称为 XML 的本机数据类型。用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列;此外,还允许带有变量和参数。为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB)。</P>
<P>SQL Server 2005 提供了 XML 架构集合,可以将其作为一种方法来以元数据的形式管理 W3C XML 架构。XML 数据类型可以与 XML 架构集合相关联,以便对 XML 实例强加架构限制。当 XML 数据与 XML 架构集合相关联时,它称为类型化的 XML;否则,就称为非类型化的 XML。在一个框架中可以同时容纳类型化的 XML 和非类型化的 XML,保留 XML 数据模型,并且强制采用 XML 语义进行查询处理。底层关系基础结构被广泛用于这一目的。它支持关系数据和 XML 数据之间的互操作,这为更广泛地采用 XML 功能开辟了道路。</P>
<H4>XML 数据类型查询和数据修改</H4>
<P>可以使用 T-SQL SELECT 语句来检索 XML 实例。在 XML 数据类型中提供了五种内置的方法来查询和修改 XML 实例。</P>
<P>XML 数据类型的方法接受 XQuery,它是一种新出现的 W3C 标准语言(目前处于 Last Call(最后请求)状态),并且包括导航语言 XPath 2.0。也可以使用一种语言来修改 XML 数据,比如添加或删除子树和更新标量值。与一大组函数一起,嵌入式的 XQuery 和数据修改语言为处理 XML 数据提供了丰富的支持。</P>
<P>XQuery 类型系统与 W3C XML 架构类型是一致的。大多数 SQL 类型与 XQuery 类型系统是兼容的(例如,小数)。少数类型(例如,xs:duration)是以内部格式存储的,并且可以通过适当的解释来与 XQuery 类型系统兼容。 </P>
<P>编译阶段检查 XQuery 表达式和数据修改语句的静态类型的正确性,并且在类型化 XML 的情况下使用 XML 架构来进行类型推理。如果表达式由于类型安全冲突而在运行时失败,则会产生静态类型错误。 </P>
<H4>XML 索引</H4>
<P>查询执行在运行时处理每个 XML 实例;如果 XML 值比较大或需要在表的许多行中对查询进行求值,则查询执行就会变得非常费时。因此提供了一种索引 XML 列的机制来加速查询。</P>
<P>B+ 树广泛用于建立关系数据的索引。XML 列的主 XML 索引在该列中 XML 实例的所有标记、值和路径上都创建一个 B+ 树索引。通过这种方式,可以有效地对 XML 数据中的查询进行求值,并且在保留文档顺序和文档结构的同时从 B+ 树重新组合 XML 结果。 </P>
<P>可以在 XML 列中创建次 XML 索引来加速不同类别的常见查询:PATH 索引(用于基于路径的查询)、PROPERTY 索引(用于属性包的情况)和 VALUE 索引(用于基于值的查询)。 </P>
<H4>XML 架构处理</H4>
<P>XML 列、变量和参数可以根据 XML 架构的集合(它可能与另一个集合相关(例如,通过使用 )或不相关)有选择地进行类型化。每个类型化的 XML 实例都从它遵循的 XML 架构集合指定目标命名空间。数据库引擎在数据分配和修改时根据 XML 架构来验证实例的有效性。 </P>
<P>XML 架构信息用于存储和查询优化。类型化的 XML 实例在内部的二进制表示中包含类型化的值,这与 XML 索引中的一样。通过这种方式,可以有效地处理类型化 XML 数据。</P>
<H4>关系数据和 XML 数据的集成</H4>
<P>用户可以在同一个数据库中存储关系数据和 XML 数据。简而言之,数据库引擎除了知道如何遵循关系数据模型之外,还知道如何遵循 XML 数据模型。在升级到 SQL Server 2005 之后,关系数据和 SQL 应用程序仍然能够正常工作。在服务器上,可以将驻留在文件和文本或图像列中的 XML 数据移到 XML 数据类型的列中。通过使用 XML 数据类型的方法,可以建立 XML 列的索引,并对其进行查询和修改。</P>
<P>数据库利用现有的关系基础结构和引擎组件(例如存储引擎和查询处理器)来进行 XML 处理。例如,XML 索引可以创建 B+ 树,而且可以在 Showplan 输出中查看查询计划。通过集成到关系框架中,数据管理功能(如备份/恢复和复制)可用于 XML 数据。同样地,新的数据管理功能(如数据库镜像和快照隔离)可以处理 XML 数据类型,以提供无缝的用户体验。</P>
<P>结构化数据应该存储在表和关系列中。当应用程序需要执行细粒度查询和数据修改时,对于使用 XML 的半结构化数据和标记数据,XML 数据类型是比较合适的选择。 </P>
<H4>FOR XML 和 OpenXML 增强</H4>
<P>现有的 FOR XML 功能已经在几个方面得到了增强。它能够处理 XML 数据类型的实例和其他新的 SQL 类型,例如 [n]varchar(max)。 </P>
<P>新的 TYPE 指令生成的 XML 数据类型实例可以分配给 XML 列、变量或参数,也可以使用 XML 数据类型的方法进行查询。这允许嵌套 SELECT ...FOR XML TYPE 语句。</P>
<P>PATH 模式允许用户指定出现列值的 XML 树中的路径,并且与上述嵌套一起使用时比 FOR XML EXPLICIT 更易于编写。 </P>
<P>XSINIL 指令与 ELEMENTS 一起使用,可以将 NULL 映射到带有属性 xsi:nil="true" 的元素。另外,新的 ROOT 指令还允许在所有的 FOR XML 模式下指定根节点。新的 XMLSCHEMA 指令生成 XSD 内联架构。</P>
<P>OpenXML 的功能增强包括在 sp_preparedocument 中接受 XML 数据类型以及在行集中生成 XML 和新的 SQL 类型的列。</P>
<H4>对 XML 数据类型的客户端访问</H4>
<P>客户端可以通过几种方式访问服务器中的 XML 数据。使用 ODBC 和 OLE DB 的本机 SQL 客户端访问以 Unicode 字符串的形式传递 XML 数据类型。OLE DB 还提供对流 Unicode 数据的 XML 数据类型的 ISequentialStream 访问。 </P>
<P>托管访问通过 .NET 框架 V2.0 中的 ADO.NET 将 XML 数据作为一个名为 SqlXml 的新类进行传递。它支持一个名为 <B>CreateReader()</B> 的方法,该方法返回 XmlReader 实例来读取返回的 XML。同样地,数据集能够将 XML 数据类型的实例加载到中间层的列,中间层可以作为 XML 文档进行编辑,并且重新保存到 SQL Server。这两者都支持对服务器发出 SQL 查询,以检索在中间层操作的 XML 列。</P>
<P>在 SQL Server 2005 中,可以使用直接对 HTTP 终结点进行的SOAP 访问来查询、检索和修改 XML 数据。</P>
<P>本机和托管客户端技术都提供了新的接口来检索类型化 XML 列的 XML 架构集合。</P>
<H4>带有 XQuery 的客户端 XML 支持</H4>
<P>除了使用 ADO.NET 来检索表并将结果存放到关系数据集中之外,您还可以使用 XQueryCommand 类将关系数据直接加载到中间层的 XML 文档。该类提供了一个中间层 XQuery 处理器,它能够将 T-SQL 语句作为 XQuery 语言的一部分嵌入。通过这种方式,您可以查询本地 XML 文件,也可以从 SQL Server 检索数据(直接从表或者通过数据库存储程序),再将数据构造成 XML 格式,然后将其加载到中间层 XML 文档。这大大简化了 SQL Server 中的查询,将查询结果构造成特定的 XML 格式,并使其流向业务合作伙伴,而不需要将数据加载到数据集来执行数据转换。</P>
<DIV style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">#p#<STRONG>二、推动 XML 存储方案</STRONG></DIV>
<P>XML 数据变得越来越普遍.它可以表示客户数据,带有或不带有描述数据的 XML 架构均可。XML 数据和 XML 架构需要在一起进行管理。实际应用程序的 XML 架构通常比较复杂,因而将这样的 XML 架构映射到表和列是一项复杂的任务。当 XML 架构改变或新的架构加入系统时,长时间维护这样的映射是一件很麻烦的事情。通常,XML 数据存储在文件系统或数据库服务器的文本列中。文本列有数据管理方面的好处(例如,复制和备份/恢复),但是不提供任何基于数据的 XML 结构的查询支持。在具有原生 XML 支持的情况下,使用 XML 进行应用程序开发变得更快。</P>
<H3>自定义属性管理</H3>
<P>一些应用程序(例如用户界面软件)允许用户从一组固定的属性中进行选择。而其他应用程序则允许用户定义他们自己感兴趣的属性。如果这样的自定义属性是以 XML 的格式存储的,它们就可以很好地进行管理。应用程序可以支持标量属性以外的属性: </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>•</TD>
<TD class=listItem>
<P>可以支持对象中的多值属性,例如,多个电话号码。 </P></TD></TR>
<TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -