在SQLServer中用XQuery分解XML数据

作者:网络 来源:佚名 更新时间:2008-09-19 10:53:22 点击:

  在举例说明如何分解上一篇文章中的数据时,我们首先了解一下xquery和它在sql server 2005中为开发者提供的功能。

  xquery介绍

  xquery,也称作xml query,是一种查询xml数据的语言,允许你提取所需的节点和元素。它由w3c定义,可用于今天的大多数主流数据库引擎中,如oracle、db2和sql server。

  sql server 2005 xquery函数

  下面的四个函数是sql server 2005中的xquery函数。(注意,xml、xquery语句和下面的函数都区分大小写。例如,sql编译器接受xml数据中的.exist,但拒绝.exist或.exist。)

  xml.exist

  这个方法根据一个xml节点上的搜索表达式返回一个布尔值。例如,列表a中xml代码片段中的语句将返回1(真):

  select @x.exist('/christmaslist/person[@gift = "socks"]')

  这个语句返回0(假):

  select @x. exist ('/christmaslist/zach')

  由于“socks”一词被封套,这个语句将返回0(假)。

  select @x.exist('/christmaslist/person[@gift = "socks"]')

  xml.value

  这个方法接受一个xquery语句并返回一个单独值。使用列表a中同样的xml代码片段,不可以使用value函数生成“betty”值,如下所示:

  select @x.value('/christmaslist[1]/person[1]/@name', 'varchar(20)')

  而xquery生成“zach”值。

  select @x.value('/christmaslist[1]/person[2]/@name', 'varchar(20)')

  xml.query

  这个方法接受一个xquery并返回一个xml数据类型的实例。可以按需要将这些查询简单或复杂化,下面是一个简单的例子:

  select @x.query('/christmaslist/person')

  它返回xml文件:

  以下是引用片段:
<person name="betty" gift="camera" />
<person name="zach" gift="elmo doll" />
<person name="brad" gift="socks" />

  xml.nodes

  在你需要将一个xml数据类型变量中的数据分解到关系数据中时,这个方法十分有用。这个方法接受一个xquery语句作为参数,并返回一个包含xml变量逻辑标量数据的行集。列表b中的查询利用上面定义的xml变量,并将数据分解到一个结果集中,它显示在xml变量中定义的人物姓名。

  修改openxml存储过程

  现在我来说明如何修改上周的openxml存储过程,使其可以应用xquery功能。首先,我往xml变量中加载一些数据。如列表c所示。我们可以建立一个接受xml参数的过程,再应用xquery函数把xml文件中的数据插入一个表中,而不必应用openxml。如列表d所示。

  最初在数据库中应用xml似乎有些难于处理,还要花一些时间习惯使用xquery和xpath查询。但是,经过一段时间的学习以后,你就会发现在数据库中应用xml数据相当实用。

  例如,在上述存储过程中应用xml数据,你只需调用一次数据库,而不必像典型存储过程编程那样调用n次数据库。这二者似乎区别不大,但对一个繁忙的系统而言,应用xml数据会有很大益处。而且,应用xquery而非openxml还会显著提高性能,对小型xml文件更是如此。