T-SQL XQuery (XML路径查询) (转)http://blog.csdn.net/Beirut/article/details/8150116

Posted streetpasser

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T-SQL XQuery (XML路径查询) (转)http://blog.csdn.net/Beirut/article/details/8150116相关的知识,希望对你有一定的参考价值。

  1 /*
  2 T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集。
  3 XQuery 基于现有的 XPath 查询语言,并支持更好的迭代、更好的排序结果以及构造必需的 XML 的功能。
  4 在前面我们已经学习了 XPath 的基本语法,本章将学习T-SQL 的 XQuery 语法
  5 ------------------------------------------------------------------------------------------------------------------   
  6 T-SQL XQuery包含如下函数
  7 query(XPath条件):  结果为 xml 类型; 返回由符合条件的节点组成的非类型化的 XML 实例
  8 value(XPath条件,数据类型):结果为指定的标量值类型; xpath条件结果必须唯一
  9 exist(XPath条件):结果为布尔值; 表示节点是否存在,如果执行查询的 XML 数据类型实例包含NULL则返回NULL
 10 nodes(XPath条件): 返回由符合条件的节点组成的一行一列的结果表
 11 */
 12 
 13 DECLARE @x XML 
 14 SET @x=
 15 <root>
 16   <rogue id="001">
 17     <hobo id="1">
 18       <name>彪</name>
 19       <name>阿彪</name>
 20       <type>流氓</type>
 21     </hobo>
 22   </rogue>
 23   <rogue id="002">
 24     <hobo id="2">
 25       <name>光辉</name>
 26       <name>二辉</name>
 27       <type>流氓</type>
 28     </hobo>
 29   </rogue>
 30   <rogue id="001">
 31     <hobo id="3">
 32       <name>小德</name>
 33       <name>小D</name>
 34       <type>臭流氓</type>
 35     </hobo>
 36   </rogue>
 37 </root>
 38 --取root的所有子节点
 39 --SELECT @x.query(‘root‘),@x.query(‘/root‘),@x.query(‘.‘)
 40 --/*注释:
 41 --    这里实际上是取所有节点,root 必须是最高级节点名称,当换成任意子节点都是取不到值的
 42 --*/
 43 --取 hobo 的所有子节点,不管 hobo 在文档中的位置。
 44 SELECT @x.query(//hobo)
 45 ----扩展:取rogue下 所有  name
 46 SELECT @x.query(//rogue//name)
 47 --取属性为id 的所有节点
 48 SELECT @x.query(//hobo[@id])
 49 /*注释:
 50     XQuery不支持直接顶级 attribute 节点,必须附带上对节点的查找
 51     属性必须要加[]
 52 */
 53 --选取属于 root 子元素的第一个 rogue 元素。
 54 SELECT @x.query(/root/rogue[1])
 55 --选取属于 root 子元素的最后一个 rogue 元素。
 56 SELECT @x.query(/root/rogue[last()])
 57 --选取属于 root 子元素的倒数第二个 rogue 元素。
 58 SELECT @x.query(/root/rogue[last()-1])
 59 --选取最前面的两个属于 root 元素的子元素的 rogue 元素。
 60 SELECT @x.query(/root/rogue[position()<3])
 61 --选取 root 元素的所有 hobo 元素,且其中的属性 id 的值须大于 1。
 62 SELECT @x.query(/root//hobo[@id>1])
 63 ----扩展: root 元素的所有 hobo 元素,且其中的属性 id 的值须大于 1 并且子节点 name 的值为 光辉 的。
 64 SELECT @x.query(/root/rogue[./hobo[@id>1 and name="光辉"]])
 65 --选取 root 子元素的所有 rogue 元素,且 属性id 的值须大于 为001 子元素hobo 属性 id 的值为 1的
 66 SELECT @x.query(/root/rogue[@id="001" and ./hobo[@id=1]])
 67 --if then else 表达式  
 68 SELECT @x.query(
 69 if ( 1=2 ) then
 70   /root/rogue[@id="001"]
 71 else
 72   /root/rogue[@id="002"]
 73 )
 74 
 75 --路径表达式步骤中的谓词 
 76 SELECT @x.query(/root/rogue[1]/hobo/name)--选择第一个 /root/rogue 节点下的所有 <Name> 元素。
 77 SELECT @x.query(/root/rogue/hobo[1]/name)--选择 /root/rogue/hobo 节点下的所有 <Name> 元素。
 78 SELECT @x.query(/root/rogue/hobo/name[1])--选择 /root/rogue/hobo 节点下的所有第一个 <Name> 元素。
 79 SELECT @x.query((/root/rogue/hobo/name)[1])--选择 /root/rogue/hobo 节点下的第一个 <Name> 元素。
 80 --使用聚合函数
 81 SELECT @x.query(count(/root/rogue/hobo/name)),@x.query(count(/root/rogue/hobo/name[1]))
 82  --FLWOR 迭代语法。FLWOR 是 for、let、where、order by 和 return 的缩写词。
 83 --1
 84 SELECT @x.query(
 85 <result>
 86  { for $i in /root/rogue/hobo/name[1]
 87     return string($i)
 88  }
 89 </result>)
 90 --2
 91 SELECT @x.query(
 92    for $Loc in /root/rogue/hobo,
 93        $FirstStep in $Loc/name[1]
 94    return 
 95        string($FirstStep)
 96 )
 97 --3
 98 SELECT @x.query(
 99    for $i in /root/rogue/hobo
100    order by $i/@id descending
101    return string($i/name[1])
102 )
103 --4
104 SELECT @x.query(
105    for $i in /root/rogue/hobo
106    order by local-name($i) 
107    return string($i/name[1])
108 )

 

以上是关于T-SQL XQuery (XML路径查询) (转)http://blog.csdn.net/Beirut/article/details/8150116的主要内容,如果未能解决你的问题,请参考以下文章

xml XML XQuery,FLWOR查询

使用 XPath/XQuery 过滤 XML 列上的 SQL 查询

XQuery 如何使用 WHERE 查询获取整个 xml 文档

sql 使用XQuery方法查询,值,存在,节点在SQL Server中查询XML

eXist DB & XQuery:带有属性的 xml-root 导致没有结果

XPath与Xquery