/***************************************************
作者:herowang(让你望见影子的墙)
日期:2009.10.21
注: 转载请保留此信息
****************************************************/
declare @myxml xml
set @myxml='<root>成绩表--这是个文本节点
<item id="1" year="2009" depart="计算机" class="1班">
<sname> 王一诺</sname>
<course1>sql server2005</course1>
<grade>82</grade>
</item>
<item id="2" year="2009" class="1班">
<sname>王海</sname>
<course1>sql server2005</course1>
<grade>75</grade></item>
<item id="3" year="2009" class="1班">
<sname>王若天</sname>
<course1>oracle</course1>
<grade>59</grade>
</item>
</root>'
一、基础:
序列和Qname:在XQuery中,表达式的结果由xml节点与xsd原子类型的实例组成。进行构造的时候,序列必须是同类的,即序列中的单项可以是节点也可是是原子值,但不能将原子值与节点进行构造;QName即xml的限定名称,由命名空间名称与本地名称两部分组成。
原子化:在进行查询时,类型推到工作完成后,需要提取项的类型化值,这个提取过程成为原子化。Data函数用于返回指定项的类型化值。在某些环境下,该过程是隐式进行的。
XQuery支持的数据类型:1)类型化值和字符串值,使用data()来检索节点,将返回节点的类型化值,使用string()函数,则将返回节点的字符值。Data()与string()得到的都是一个序列,而不单个的值。
Data()函数示例:
select @myxml.query('data(/root/item/grade)')
------
82 75 59
所以如果要和一个数进行计算的话,必须要说明节点,如:
select @myxml.query('data(/root/item/grade)[1]+3')
------
85
String函数示例
select @myxml.query('string(/root[1])')
-------
成绩表--这是个文本节点
王一诺sql server200582王海sql server200575王若天oracle59
select @myxml.query('string(/root[1]/item[1]/sname[1])')
-------
王一诺
2) 数据类型转换:表达式 cast as atomictype? “?”表示表达式可以返回0或1个项。
select @x.query('"2" cast as xs:integer?')
select @x.query('xs:integer("2")')
Xquey中注释:注释字符串包含在(:与:)之间
select @x.query('(:这里是注释:)<root>5</root>')
------
<root>5</root>
二、表达式
1、运算符:
比较运算符:可用于比较原子值和节点。比较节点时,如果第二个序列中存在某个值与第一个序列中的某个值比较结果为true,则整个结果为true,否则为false。
select @s.query(‘(1,2,3)=(3,4)’)
-----
True
值比较运算符:用于比较原子值。等于Eq,不等于ne,小于lt,大于gt,小于等于le,大于等于ge
select @myxml.query('data(/root/item/grade)[1] gt 60')
------
True
节点比较运算符:is,如果两边的操作数代表的是同一节点,则返回true,否则为false。
select @myxml.query('(/root/item)[1] is (/root/item[@id=1])[1]')
------
True
节点顺序比较运算符:>>与<<。<<表示左边操作数表示的位置是否在右边操作数表示的位置的前面,>>则是后面
select @myxml.query('(/root/item)[1] << (/root/item[@id=2])[1]')
------
True
关系运算:and 与or,连接多个查询条件
2、FLWOR
F:for用来进行循环迭代。需要先定义一个或多个循环变量,以$开头
W:where设置筛选条件
O;order by 对返回的数据进行排序
R:retrun 返回结果
select @myxml.query
('for $item in(//item) –-定义循环变量
where ($item/grade)>60 --进行筛选
order by ($item/sname[1]) --进行排序,descending为降序
return string($item/sname[1])' --返回值
)
------
王海 王一诺
3、条件表达式
If 条件 then 表达式1 else 表达式2
注:else是必须的,如果else后不需要表达式,则使用( ).
select @myxml.query('for $item in(//item)
order by ($item/sname[1]) descending
return
if ($item/grade>60)
then string($item/sname[1])
else ()
')
------
王海 王一诺
四、构造XML
1、在构造过程中,除了构造元素之外,还要进行路径查询计算的时候,使用{},大括号充当了上下文切换的标记,即从xml构造切换到查询计算。
select @myxml.query('<newroot>{data(/root/item/grade)[1]}</newroot>')
------
<newroot>82</newroot>
在结果中要包含{}的时候,则可以用两个{{
select @myxml.query('<newroot>{{{data(/root/item/grade)[1]}}}</newroot>')
------
<newroot>{82}</newroot>
2、在构造属性时,不支持多个属性表达式或者或者混合表达式。例如要生成
<newroot item=”id 5”/>
select @myxml.query('<newroot item="{concat("id",data((/root/item/@id))[1])}"> </newroot>')
------
<newroot item="id1" />
3、空格处理
命名空间中的空格字符:修正开头和结尾处的所有空格,将内部空格字符变为一个空格;属性内容中的换行符转换为空格,所有其他的空格字符保持不变;元素中的空格不变。