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 ')