season22 发表于 2015-6-29 15:43:26

SQL Server 2005 XML 操作总结(三)元素(节点)操作——查询操作


[*] 一般查询




--文档
select @data
/*output:


......


*/
--任意级别是否存在price节点
select @data.exist('//price')
/*output:
1
*/
--获取所有book节点
select @data.query('//book')
/*output:

......


......


......


......
*/
--获取第一个book节点
select @data.query('//book')
/*output:

......

*/
--获取前两个book节点
select @data.query('//book')
/*output:

XQuery Kick Start
……


Learning XML
……

*/
--获取category="WEB"的所有book节点
select @data.query('//book[@category="WEB"]')
/*output:

XQuery Kick Start
……


Learning XML
……

*/
--获取含category属性的所有book节点
select @data.query('/bookstore/book[@category]')
/*output:

......


......


......


......
*/
--获取book节点下title的lang="en"的所有title节点
select @data.query('//book/title[@lang="en"]')
/*output:
Everyday Italian
XQuery Kick Start
*/
--获取title的lang="en"且 price>35的所有book节点
select @data.query('//book[./title[@lang="en"] or price>35 ]')
/*output:

......


......


......
*/
--获取第一个book元素的title元素的值
select @data.value('(/bookstore/book/title)', 'nvarchar(max)')
/*output:
Everyday Italian
*/
--获取title的lang="en"且 price>35的第一book的(第一个)title
select @data.query('//book[./title[@lang="en"] and price>35 ]')
              .value('(book/title)','varchar(max)')
/*output:
XQuery Kick Start
*/
--等价于“获取title的lang="en"且 price>35的第一book的(第一个)title”
select @data.value('(//book[./title[@lang="en"] and price>35 ]/title)','varchar(max)')
/*output:
XQuery Kick Start
*/

[*]根据节点名称查询




--查找第一个book节点的第一个名为title的节点的值
DECLARE @ElementName VARCHAR(20)
SELECT @ElementName = 'title'
select @data.value('(/bookstore/book/*[local-name()=
            sql:variable("@ElementName")])','varchar(30)')
/*output:
Everyday Italian
*/

[*]映射为表结构查询



--将book元素映射到数据表book列
select Tab.Col.query('.') as book from @data.nodes('/bookstore/book')Tab(Col);
--查询price元素的位置和值
SELECT a.number as position,b.price
FROM master.dbo.spt_values A
CROSS APPLY (
SELECT C.value('price','float') asprice
FROM @data.nodes('/bookstore/book')T(C)) b
WHERE A.type='P'



[*]模糊查询




--获取所有包含lang属性的节点
select @data.query('//*[@lang]')
/*output:
Everyday Italian
Harry Potter
XQuery Kick Start
Learning XML*/
--获取所有book节点
select @data.query('/bookstore/*')
/*output:

......


......


......


......
*/
--获取所有节点
select @data.query('//*')
/*output:


......


......


......


......


*/
--获取所有包含属性的title节点
select @data.query('//title[@*]')
/*output:
Everyday Italian
Harry Potter
XQuery Kick Start
Learning XML*/
--读取根节点的名称
SELECT @data.value('local-name(/*)','VARCHAR(20)') AS ElementName
/*output
bookstore
*/
--读取第三级上第一个节点的名称和值
SELECT @data.value('local-name((/*/*/*))','VARCHAR(20)') AS ElementName,
       @data.value('(/*/*/*/text())','VARCHAR(20)') AS ElementValue
/*output
title   Everyday Italian
*/
--读取第二级上第一个节点下属节点的名称和值
SELECT
    C.value('local-name(.)','VARCHAR(200)') AS ElementName,
    C.value('.','VARCHAR(200)') AS ElementValue
FROM @data.nodes('/*/*/*') T(C)
  


[*] 相邻节点查询




--获取第一个category=“WEB”的book节点的前一个book节点
select @data.query('(/bookstore/book[. >
(/bookstore/book[@category="WEB"])])')
/*output:

Learning XML
Erik T. Ray
2003
39.95
*/

[*]节点数目查询




--获得book节点的数量
SELECT@data.value('count(/bookstore/book)','INT')
/*output:
4
*/
  
页: [1]
查看完整版本: SQL Server 2005 XML 操作总结(三)元素(节点)操作——查询操作