SQL SERVER XML学习总结(二)
.2 谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
例: /root/Info/user[1]
4.3 选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符
描述
*
匹配任何元素节点。
@*
匹配任何属性节点。
node()
匹配任何类型的节点。
例:/root/info/* info节点下的所有元素节点
/root/info/@* info 节点下所有的属性节点
//user[@*] 所有带有属性的user节点
4.4 选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
例://User | /root/Info/@id
5. XQuery
5.1 基本的查询
DECLARE @dataSource XML
SET @dataSource='
笨笨
MG
Olive
MG
墨遥
NMG
'
--获取root所有子节点
select @dataSource.query('.')
select @dataSource.query('root')
select @dataSource.query('/root')
----获取所有的info节点
select @dataSource.query('//info')
----获取所有info节点下user节点的name节点
select @dataSource.query('//info/user/name')
----获取所有uid>1的所有Info节点
select @dataSource.query('/root/info[./user[@uid>1]]')
if then else 表达式
select @dataSource.query('if (1=3) then /root/info[./user[uid=1]] else /root/info[./user[name="Olive"]]')
--路径表达式步骤中的谓词,获取第一个info节点下的user节点下的name
select @dataSource.query('/root/info[1]/user/name')
--聚合函数
select @dataSource.query('count(/root/info[./user[type="MG"]])')
--FLWOR语法:For、Let、Where、Order by、Return
select @dataSource.query('{for $li in /root/info/user/name[1] return string($li)} ')
select @dataSource.query('{for $li in /root/info,$lii in $li/user/name[1] return string($lii)}
')
select @dataSource.query('{for $li in /root/info/user order by $li/@uid descending return $li} ')
select @dataSource.query('{for $li in /root/info/user order by local-name($li) return $li} ')
5.2 Value()
--value()获取某一节点或其属性的值,然后将其赋值给nvarchar类型
select @dataSource.value('(/root/info/user[1]/name)[1]','nvarchar(20)')
5.3 Exist()
select @dataSource.exist('/root/info/user/name[text()[1]="笨笨"]')
--将日期类型的节点属性转换为日期类型再与对应的值进行比较
declare @date xml
set @date=' '
--exist()
select @date.exist('/root[(@date cast as xs:date ) eq xs:date("2013-10-07")]')
--将日期类型的节点的值转换为日期类型再与对应的值进行比较,date[text()[1] cast xs:date ,将节点值转换为日期类型
declare @date1 xml
set @date1='2013-10-07 '
select @date1.exist('/root/date[(text()[1] cast as xs:date ) eq xs:date("2013-10-07")]')
--取任意属性的值:sql:variable("@attriname")
declare @attr nvarchar(20)='uid'
if @dataSource.exist('/root/info/user/@*[local-name()=sql:variable("@attr")]')>=1
select 'OK'
else select @dataSource.query('/root/info/user/name[local-name()="笨笨"]')
5.4 Nodes()
--nodes()方法,将一个xquery表达式拆分成多行
select T.c.query('.') as result from @dataSource.nodes('/root/info') as T(c)
select T.c.query('.') as result from @dataSource.nodes('/root/info/user') as T(c)
select T.c.value('(@uid)[1]','varchar(10)') as id,
T.c.value('(./name)[1]','nvarchar(20)') as name,
T.c.value('(./type)[1]','nvarchar(20)') as [type]
from @dataSource.nodes('/root/info/user') T(c)
--第一个value方法获取b节点下的值:cec,第二个value方法获取b节点下的值:c
declare @xml xml='ce c '
select @xml.value('(/root/a/b)[1]','nvarchar(20)'),@xml.value('(/root/a/b/text())[1]','nvarchar(20)')
--组合