SQL Server 中XML数据操作

首先要明确一个基本原则,XML类型的数据之间以及XML类型与其它数据类型之间都是不能比较的,也就是说XML类型的数据不能出现在等号的任何一边。 大致可分为查询类,修改类和跨域查询类。 查询类包含query(),value(),exist()和nodes(). 修改类包含modify(). 跨域查询类包含sql:variable()和sql:column() 查询类:

 1. query()方法:返回满足条件的所有XML行。只能用于SELECT子句当中。
 2. value()方法:返回从XML节点中提取的标量值。必须在value()方法的第二个参数中指定所返回的标量的数据类型,所以   value()方法可以与其它标量进行比较。可用于SELECT子句和WHERE子句。
 3. exist()方法:返回int型标量的0或者1。对每行的XML数据类型进行存在性检查。可用于SELECT子句和WHERE子句。
 4. nodes()方法:返回只有一个栏位的table,且该table的栏位是XML数据类型。所以nodes()方法只能出现在FROM子句中。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点
/bookstore

选取根元素 bookstore

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取所有属于 bookstore 的子元素的 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取所有名为 lang 的属性。

示例代码:

 


declare @XMLVar xml = '
<catalog>
<book category="ITPro" id="1">
<title>Windows Step By Step</title>
<author>Bill Zack</author>
<price>49.99</price>
</book>
<book category="Developer" id="2">
<title>Developing ADO .NET</title>
<author>Andrew Brust</author>
<price>39.93</price>
</book>
<book category="ITPro" id="3">
<title>Windows Cluster Server</title>
<author>Stephen Forte</author>
<price>59.99</price>
<title>Windows Step By Step</title>
<author>Bill Zack2</author>
<price>49.99</price>
<title>Windows Step By Step</title>
<author>Bill Zack3</author>
<price>49.99</price>
</book>
</catalog>
'

-- 1. query()方法:返回满足条件的所有XML行。只能用于SELECT子句当中。
--
2. value()方法:返回从XML节点中提取的标量值。必须在value()方法的第二个参数中指定所返回的标量的数据类型,
--
所以value()方法可以与其它标量进行比较。可用于SELECT子句和WHERE子句。
--
3. exist()方法:返回int型标量的0或者1。对每行的XML数据类型进行存在性检查。可用于SELECT子句和WHERE子句。
--
4. nodes()方法:返回只有一个栏位的table,且该table的栏位是XML数据类型。所以nodes()方法只能出现在FROM子句中。

-- 1. xml.query 关于 query 查询
--
select @XMLVar.query('/catalog/book[@category=''Developer'']')
--
select @XMLVar.query('//book[@category=''Developer'']')
--
select @XMLVar.query('//title/..[@category=''Developer'']')
--
select @XMLVar.query('//title/.')
--

--
2. xml.value 关于 value 查询
--
select @XMLVar.value('/catalog[1]/book[2]/title[1]','nvarchar(50)')
--
select @XMLVar.value('/catalog[1]/book[1]/@category','nvarchar(max)')
--
select @XMLVar.value('(/catalog//book[@category = ''ITPro'']/title)[1]','nvarchar(max)')
--

--
3. xml.exist 关于exist的使用
--
select @XMLVar.exist('//book[@category=''Developer'']')
--
select @XMLVar.query('//book[@category=''Developer'']') where @XMLVar.exist('//book[@category=''Developer'']') = 1
--

--
4. xml.nodes 关于nodes的使用
--
select c.doc.value('./@id','nvarchar(max)') as id
--
, c.doc.value('./@category','nvarchar(max)') as category
--
, c.doc.query('.')
--
, d.doc.query('.')
--
, d.doc.value('..[1]','nvarchar(max)')
--
from dbo.spt_values
--
cross join @XMLVar.nodes('/catalog/book[@id=''3'']') as c(doc)
--
cross join @XMLVar.nodes('/catalog/book[@id=''3'']/author') as d(doc)
--
where name = 'rpc'

 

 

posted @ 2010-12-26 13:36  13路易的  阅读(472)  评论(0编辑  收藏  举报