转载---SQL Server XML基础学习之<5>--XQuery(query)

本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法

T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集。
XQuery 基于现有的 XPath 查询语言,并支持更好的迭代、更好的排序结果以及构造必需的 XML 的功能。
在前面我们已经学习了 XPath 的基本语法,本章将学习T-SQL 的 XQuery 语法
------------------------------------------------------------------------------------------------------------------   
T-SQL XQuery包含如下函数
query(XPath条件):  结果为 xml 类型; 返回由符合条件的节点组成的非类型化的 XML 实例
value(XPath条件,数据类型):结果为指定的标量值类型; xpath条件结果必须唯一
exist(XPath条件):结果为布尔值; 表示节点是否存在,如果执行查询的 XML 数据类型实例包含NULL则返回NULL
nodes(XPath条件): 返回由符合条件的节点组成的一行一列的结果表
*/

DECLARE @x XML 
SET @x='
<root>
  <rogue id="001">
    <hobo id="1">
      <name>彪</name>
      <name>阿彪</name>
      <type>流氓</type>
    </hobo>
  </rogue>
  <rogue id="002">
    <hobo id="2">
      <name>光辉</name>
      <name>二辉</name>
      <type>流氓</type>
    </hobo>
  </rogue>
  <rogue id="001">
    <hobo id="3">
      <name>小德</name>
      <name>小D</name>
      <type>臭流氓</type>
    </hobo>
  </rogue>
</root>'
--取root的所有子节点
--SELECT @x.query('root'),@x.query('/root'),@x.query('.')
--/*注释:
--	这里实际上是取所有节点,root 必须是最高级节点名称,当换成任意子节点都是取不到值的
--*/
--取 hobo 的所有子节点,不管 hobo 在文档中的位置。
SELECT @x.query('//hobo')
----扩展:取rogue下 所有  name
SELECT @x.query('//rogue//name')
--取属性为id 的所有节点
SELECT @x.query('//hobo[@id]')
/*注释:
	XQuery不支持直接顶级 attribute 节点,必须附带上对节点的查找
	属性必须要加[]
*/
--选取属于 root 子元素的第一个 rogue 元素。
SELECT @x.query('/root/rogue[1]')
--选取属于 root 子元素的最后一个 rogue 元素。
SELECT @x.query('/root/rogue[last()]')
--选取属于 root 子元素的倒数第二个 rogue 元素。
SELECT @x.query('/root/rogue[last()-1]')
--选取最前面的两个属于 root 元素的子元素的 rogue 元素。
SELECT @x.query('/root/rogue[position()<3]')
--选取 root 元素的所有 hobo 元素,且其中的属性 id 的值须大于 1。
SELECT @x.query('/root//hobo[@id>1]')
----扩展: root 元素的所有 hobo 元素,且其中的属性 id 的值须大于 1 并且子节点 name 的值为 光辉 的。
SELECT @x.query('/root/rogue[./hobo[@id>1 and name="光辉"]]')
--选取 root 子元素的所有 rogue 元素,且 属性id 的值须大于 为001 子元素hobo 属性 id 的值为 1的
SELECT @x.query('/root/rogue[@id="001" and ./hobo[@id=1]]')
--if then else 表达式  
SELECT @x.query('
if ( 1=2 ) then
  /root/rogue[@id="001"]
else
  /root/rogue[@id="002"]
')

--路径表达式步骤中的谓词 
SELECT @x.query('/root/rogue[1]/hobo/name')--选择第一个 /root/rogue 节点下的所有 <Name> 元素。
SELECT @x.query('/root/rogue/hobo[1]/name')--选择 /root/rogue/hobo 节点下的所有 <Name> 元素。
SELECT @x.query('/root/rogue/hobo/name[1]')--选择 /root/rogue/hobo 节点下的所有第一个 <Name> 元素。
SELECT @x.query('(/root/rogue/hobo/name)[1]')--选择 /root/rogue/hobo 节点下的第一个 <Name> 元素。
--使用聚合函数
SELECT @x.query('count(/root/rogue/hobo/name)'),@x.query('count(/root/rogue/hobo/name[1])')
 --FLWOR 迭代语法。FLWOR 是 for、let、where、order by 和 return 的缩写词。
--1
SELECT @x.query('
<result>
 { for $i in /root/rogue/hobo/name[1]
    return string($i)
 }
</result>')
--2
SELECT @x.query('
   for $Loc in /root/rogue/hobo,
       $FirstStep in $Loc/name[1]
   return 
       string($FirstStep)
')
--3
SELECT @x.query('
   for $i in /root/rogue/hobo
   order by $i/@id descending
   return string($i/name[1])
')
--4
SELECT @x.query('
   for $i in /root/rogue/hobo
   order by local-name($i) 
   return string($i/name[1])
')

 

转载于:https://www.cnblogs.com/Frank99/p/5974448.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML》实验任务书 XQuery [实验目的] 1、学习如何使用XMLSPY集成开发环境编写、执行、以及调试XQuery。 2、理解和掌握XQuery查询计划的基本结构、各种子句的使用、(递归)函数的声明和使用、嵌套查询的使用,能够熟练地利用集成开发环境编写完成各种查询工作的XQuery查询计划,为在主流关系数据库中使用XQuery进行数据检索打下基础。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,创建XQuery查询计划,熟悉工具菜单中为XQuery的执行、调试提供的各种支持。 2、逐个打开并执行XQuery->W3CUseCases中各类查询中给出的查询计划,并且弄懂其含义,并尝试自行编写; 3、打开附件中提供的Flights-Data.xml文档,编写下列XQuery查询计划,要求所得的结果必须是良构的XML文档: ①. 列出2005-12-24日从North Pole出发的所有航班(dataQ1.xquery); ②. 查询2005-12-24日最繁忙(计算出发和到达航班)的机场、以及其进出航班总数(dataQ2.xquery); ③. 按照2005-12-24日机场繁忙程度(计算进出旅客总数)列出机场(忽略没有旅客进出的机场)、以及其进出旅客总数(dataQ3.xquery); ④. 查询所有名为Santa Claus的乘客的航班目的地(dataQ4.xquery); 在上述查询计划中,③相对比较复杂,需要使用一些嵌套查询,如果有必要,可以逐步编写子查询,通过调试或者执行观察结果,然后组合构成完整的查询计划;也可以将某些嵌套查询封装为函数(需要使用序列类型来自定义函数),以增加查询计划的可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值