• 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 ')
  • 相关阅读:
    前端安全-XSS攻击
    leetcode-0003 无重复字符的最长子串
    leetcode-0002 两数相加
    leetcode-0001 两数之和
    数据结构篇-数组(TypeScript版+Java版)
    前端性能优化(一)-- 文件的压缩与合并
    《深入浅出RxJS》读书笔记
    python工具函数
    [其他]Ubuntu安装genymotion后unable to load VirtualBox engine
    [linux]CentOS无法使用epel源
  • 原文地址:https://www.cnblogs.com/streetpasser/p/5315833.html
Copyright © 2020-2023  润新知