`
li_hy2002
  • 浏览: 11236 次
  • 性别: Icon_minigender_1
  • 来自: 金坛
最近访客 更多访客>>
社区版块
存档分类
最新评论

SQL Server 2005 XML 操作总结(转)

 
阅读更多

转载网上的,方便以后查找

 

后续文章中的操作全部都针对该示例

 

declare @data xml
set @data='
<bookstore>
<book category="COOKING" >
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="jp">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="cn">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
'

 

节点查询操作

 

  •  一般查询
--文档
select @data
/*output:
<bookstore>
<book category="COOKING">
......
</book>
</bookstore>
*/
--任意级别是否存在price节点
select @data.exist('//price')
/*output:
1
*/
--获取所有book节点
select @data.query('//book')
/*output:
<book category="COOKING">
......
</book>
<book category="CHILDREN">
......
</book>
<book category="WEB">
......
</book>
<book category="WEB">
......
</book>
*/
--获取第一个book节点
select @data.query('//book[1]')
/*output:
<book category="COOKING">
......
</book>
*/
--获取前两个book节点
select @data.query('//book[position()<=2]')
/*output:
<book category="COOKING">
......
</book>
<book category="CHILDREN">
......
</book>
*/
--获取最后一个book节点
select @data.query('//book[last()]')
/*output:
<book category="WEB">
......
</book>
*/
--获取price>35的所有book节点
select @data.query('//book[price>35]')
/*output:
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
……
</book>
<book category="WEB">
<title lang="cn">Learning XML</title>
……
</book>
*/
--获取category="WEB"的所有book节点
select @data.query('//book[@category="WEB"]')
/*output:
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
……
</book>
<book category="WEB">
<title lang="cn">Learning XML</title>
……
</book>
*/
--获取含category属性的所有book节点
select @data.query('/bookstore/book[@category]')
/*output:
<book category="COOKING">
......
</book>
<book category="CHILDREN">
......
</book>
<book category="WEB">
......
</book>
<book category="WEB">
......
</book>
*/
--获取book节点下title的lang="en"的所有title节点
select @data.query('//book/title[@lang="en"]')
/*output:
<title lang="en">Everyday Italian</title>
<title lang="en">XQuery Kick Start</title>
*/
--获取title的lang="en"且 price>35的所有book节点
select @data.query('//book[./title[@lang="en"] or price>35 ]')
/*output:
<book category="COOKING">
......
</book>
<book category="WEB">
......
</book>
<book category="WEB">
......
</book>
*/
--获取第一个book元素的title元素的值
select @data.value('(/bookstore/book/title)[1]', '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)[1]','varchar(max)')
/*output:
XQuery Kick Start
*/
--等价于“获取title的lang="en"且 price>35的第一book的(第一个)title”
select @data.value('(//book[./title[@lang="en"] and price>35 ]/title)[1]','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")])[1]','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[1]','float') as price
FROM @data.nodes('/bookstore/book[position()=sql:column("number")]')T(C)) b
WHERE A.type='P'

  • 模糊查询
--获取所有包含lang属性的节点
select @data.query('//*[@lang]')
/*output:
<title lang="en">Everyday Italian</title>
<title lang="jp">Harry Potter</title>
<title lang="en">XQuery Kick Start</title>
<title lang="cn">Learning XML</title>
*/
--获取所有book节点
select @data.query('/bookstore/*')
/*output:
<book category="COOKING">
......
</book>
<book category="CHILDREN">
......
</book>
<book category="WEB">
......
</book>
<book category="WEB">
......
</book>
*/
--获取所有节点
select @data.query('//*')
/*output:
<bookstore>
<book category="COOKING">
......
</book>
<book category="CHILDREN">
......
</book>
<book category="WEB">
......
</book>
<book category="WEB">
......
</book>
</bookstore>
*/
--获取所有包含属性的title节点
select @data.query('//title[@*]')
/*output:
<title lang="en">Everyday Italian</title>
<title lang="jp">Harry Potter</title>
<title lang="en">XQuery Kick Start</title>
<title lang="cn">Learning XML</title>
*/
--读取根节点的名称
SELECT @data.value('local-name(/*[1])','VARCHAR(20)') AS ElementName
/*output
bookstore
*/
--读取第三级上第一个节点的名称和值
SELECT @data.value('local-name((/*/*/*)[1])','VARCHAR(20)') AS ElementName,
@data.value('(/*/*/*/text())[1]','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('/*/*[1]/*') T(C)
 

  •  相邻节点查询
--获取第一个category=“WEB”的book节点的前一个book节点
select @data.query('(/bookstore/book[. << (/bookstore/book[@category="WEB"])[1]])[last()]')
/*output:
<book>
<title lang="jp">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
*/
--获取第一个category=“WEB”的book节点的前一个book节点
select @data.query('(/bookstore/book[. >>
(/bookstore/book[@category="WEB"])[1]])[1]
')
/*output:
<book category="WEB">
<title lang="cn">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
*/
  • 节点数目查询
--获得book节点的数量
SELECT @data.value('count(/bookstore/book)','INT')
/*output:
4
*/

 

属性查询操作

 

 

========一般查询=========
--获得第一个book节点的category属性值
select @data.value('(/bookstore/book/@category)[1]', 'nvarchar(max)')
/*output:
COOKING
*/
--获取title的lang="en"且 price>35的第一book的(第一个)title的lang属性
select @data.value('((//book[@category="WEB" and
price>35 ]/title)[1]/@lang)[1]
','varchar(max)')
/*output:
en
*/
--获取第一本书的title
select @data.value('(/bookstore/book[position()=1]/title)[1]','varchar(max)')
/*output:
Everyday Italian
*/
========根据属性名称查询========
--获取第一个book节点的名为category的属性值
DECLARE @att VARCHAR(20)
SELECT @att = 'category'
select @data.value('(/bookstore/book/@*[local-name()=sql:variable("@att")])[1]','VARCHAR(20)')
/*output:
COOKING
*/
========映射为表结构查询========

-获取每本书的第一个author
select Tab.Col.value('author[1]','varchar(max)') as author
   
from @data.nodes('//book')as Tab(Col)
 


--获取所有book的所有信息
select
T.C.value(
'title[1]','varchar(max)') as title,
T.C.value(
'year[1]','int') as year,
T.C.value(
'price[1]','float') as price,
T.C.value(
'author[1]','varchar(max)') as author1,
T.C.value(
'author[2]','varchar(max)') as author2,
T.C.value(
'author[3]','varchar(max)') as author3,
T.C.value(
'author[4]','varchar(max)') as author4
from @data.nodes('//book') as T(C)



--获取不是日语(lang!="jp")且价格大于35的书的所有信息
select
T.C.value(
'title[1]','varchar(max)') as title,
T.C.value(
'year[1]','int') as year,
T.C.value(
'price[1]','float') as price,
T.C.value(
'author[1]','varchar(max)') as author1,
T.C.value(
'author[2]','varchar(max)') as author2,
T.C.value(
'author[3]','varchar(max)') as author3,
T.C.value(
'author[4]','varchar(max)') as author4
from @data.nodes('//book[./title[@lang!="jp"] and price>35 ]') as T(C)

 
 
========模糊查询=========

--查询第一个book节点的第一个属性值
SELECT @data.value('(/bookstore/book[1]/@*[position()=1])[1]','VARCHAR(20)')
/*output:
COOKING
*/
 
=========查询属性数量=========
--查询第一个book节点的属性数量
SELECT @data.value('count(/bookstore/book[1]/@*)','INT')
/*output:
1
*/

 

修改、删除、移动、遍历

 

========修改操作======

--将category="WEB"的第一个book节点的year值改为2000
set @data.modify('replace value of
(/bookstore/book[@category="WEB"]/year/text())[1] with "2000"
')
/*output:
<book category="WEB">
<title lang="cn">Learning XML</title>
<author>Erik T. Ray</author>
<year>2000</year>
<price>39.95</price>
</book>
*/
--替换第一个book节点的author的内容为“替换内容”
set @data.modify('replace value of(/bookstore/book[1]/author[1]/text())[1] with ("替换内容")')
/*output:
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>替换内容</author>
<year>2005</year>
<price>30.00</price>
</book>
*/
 ========删除操作========

--删除title的@lang="en"的所有book节点
set @data.modify('delete /bookstore/book[./title[@lang="en"]]')
/*output:
<bookstore>
  <book>
    <title lang="jp">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="WEB">
    <title lang="cn">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>
*/
--删除第一个book节点的author的内容
set @data.modify('delete /bookstore[1]/book[1]/author[1]/text()')
/*output:
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author />
    <year>2005</year>
    <price>30.00</price>
  </book>
*/

========移动操作=========

--title="Harry Potter"的book节点在同级中上移一层
set @data.modify('insert (/bookstore/book[title="Harry Potter"])
before (/bookstore/book[. << (/bookstore/book[title="Harry Potter"])[1]])
[last()]
')
SET @data.modify ('delete /bookstore/book[title="Harry Potter"]
[. is (/bookstore/book[title="Harry Potter"])[last()]]
')
/*output:
<book category="CHILDREN">
......
</book>
<book category="COOKING">
......
</book>
<book category="WEB">
......
</book>
<book category="WEB">
......
</book>
*/
--title="Harry Potter"的book节点在同级中下移一层
set @data.modify('insert (/bookstore/book[title="Harry Potter"])
before (/bookstore/book[. >> (/bookstore/book[title="Harry Potter"])[1]])
[last()]
')
SET @data.modify ('delete /bookstore/book[title="Harry Potter"][1] ')
/*output:
<book category="COOKING">
......
</book>
<book category="WEB">
......
</book>
<book category="CHILDREN">
......
</book>
<book category="WEB">
......
</book>
*/
--title="Harry Potter"的book节点移到category为COOKING的book节点前
set @data.modify('insert (/bookstore/book[title="Harry Potter"])
before (/bookstore/book[@category="COOKING"])[1]
')
SET @data.modify ('delete /bookstore/book[title="Harry Potter"] [2]')
/*output:
<book category="CHILDREN">
......
</book>
<book category="COOKING">
......
</book>
<book category="WEB">
......
</book>
<book category="WEB">
......
</book>
*/
--title="Harry Potter"的book节点移到categroy为WEB的第一个book节点后
set @data.modify('insert (/bookstore/book[title="Harry Potter"])
after (/bookstore/book[@category="WEB"])[1]
')
SET @data.modify ('delete /bookstore/book[title="Harry Potter"][1] ')
/*output:
<book category="COOKING">
......
</book>
<book category="WEB">
......
</book>
<book category="CHILDREN">
......
</book>
<book category="WEB">
......
</book>
*/



========循环遍历所有元素=========

--循环所有book节点
DECLARE
   
@cnt INT,
   
@totCnt INT,
   
@child XML
-- counter variables
SELECT
   
@cnt = 1,
   
@totCnt = @data.value('count(/bookstore/book)','INT')
-- loop
WHILE @cnt <= @totCnt BEGIN
   
SELECT
       
@child = @data.query('/bookstore/book[position()=sql:variable("@cnt")]')
   
PRINT 'Processing Child Element: ' + CAST(@cnt AS VARCHAR)
   
PRINT 'Child element:  ' + CAST(@child AS VARCHAR(max))
   
PRINT ''
   
-- incremet the counter variable
    SELECT @cnt = @cnt + 1
END
/*output
Processing Child Element: 1
Child element:  <book category="COOKING">......</book>

Processing Child Element: 2
Child element:  <book><title lang="jp">......</book>


Processing Child Element: 3
Child element:  <book category="WEB">......</book>

Processing Child Element: 4
Child element:  <book category="WEB">......</book>

 

分享到:
评论

相关推荐

    SQL Server 2005 XML应用开发.iso

    SQL Server 2005 XML应用开发.isoSQL Server 2005 XML应用开发.iso

    Microsoft SQL Server 2005 向后兼容组件SQLServer2005_BC.msi

    SQLServer2005_BC.msi 文件是这个向后兼容组件的安装程序,它包含了用于在更新的SQL Server环境中模拟SQL Server 2005环境的特定库和接口。安装此组件后,用户可以继续使用那些设计时依赖SQL Server 2005特性的应用...

    SQLServer20052008 XML数据类型操作

    根据给定的文件标题、描述、标签以及部分内容,本文将详细介绍如何在SQL Server 2005 和 2008 中操作XML数据类型,并简要介绍与之相关的C# XML操作方法。 ### 一、SQL Server 2005/2008 XML 数据类型操作 #### 1. ...

    SQL Server 2005中XML数据类型的性能优化

    网上整理的文章,该文章深入探讨了有关提升Microsoft® SQL Server™ 2005中XML数据类型的查询和修改操作性能的诸多问题。为了更好的理解本文,您最好事先熟悉SQL Server 2005中有关XML的相关特性。作为背景材料,您...

    SQL Server中读取XML文件的简单做法

    在SQL Server中,读取XML文件并对其进行处理是数据库...在SQL Server的后续版本中,如SQL Server 2005及更高版本,处理XML的功能得到了显著增强,例如引入了XML数据类型和更强大的XML方法,使得XML操作更加简便高效。

    Sqlserver2005XML优化知识

    在SQL Server 2005中,XML字段的优化至关重要,因为XML数据类型在数据库中的使用日益增多。这里我们将深入探讨XML查询方法、优化策略以及如何建立XML索引来提升性能。 1. XML查询方法 - **WHERE条件**:避免在...

    SQL Server 2005 对Native XML Web 服务的支持

    总结起来,SQL Server 2005对Native XML Web服务的支持体现在以下几个关键点:内置XML数据类型、XQuery支持、Web服务集成、安全性和性能优化。这些特性极大地扩展了SQL Server的功能,使其在处理XML数据时具备了更高...

    SQLServer2005_BC.msi SQLServer2005及以后版本 向前 兼容 DTS等功能

    在"SQLServer2005_BC.msi"这个安装程序中,包含了x86、x64和ia64三种架构的版本,这意味着无论是在32位、64位还是Itanium架构的系统上,都可以进行安装和运行。这种跨平台的兼容性使得用户能够在各种不同的硬件环境...

    SQL Server 2005 XML专业编程

    《SQL Server 2005 XML专业编程》是针对数据库管理员、开发人员和数据分析师的一本深入指南,它详尽地介绍了如何在SQL Server 2005环境中使用XML技术。XML(eXtensible Markup Language)作为一种重要的数据交换格式...

    Professional SQL Server 2005 XML

    ### 《Professional SQL Server 2005 XML》核心知识点概览 #### 一、XML数据类型与服务器端处理 1. **XML数据类型的引入**: - 在SQL Server 2005中,XML被引入作为一种新的数据类型,允许在数据库中存储和管理...

    Professional SQL Server 2005 XML代码

    《Professional SQL Server 2005 XML代码》是针对SQL Server 2005数据库管理系统中XML特性的深度解析和实践指南。XML(eXtensible Markup Language)在2005年版本的SQL Server中得到了显著提升,使得数据库与Web服务...

    SQL SERVER 2005 操作 XML

    SQL Server 2005为XML提供了一系列功能,使得开发者能够更有效地存储、查询和操作XML数据。以下是关于"SQL Server 2005操作XML"的一些关键知识点: 1. **XML数据类型**:SQL Server 2005引入了XML数据类型,允许...

    OpenXML文档,sqlserver处理XML,可用于存储过程数组传参

    总结,OpenXML 是 SQL Server 处理 XML 数据的强大工具,它允许开发者灵活地将 XML 文档转换为关系型数据,方便在 SQL Server 中进行查询、更新和存储。尽管现代的 SQL Server 版本推荐使用 XQuery 和 FOR XML 来...

    professional SQL server 2005 xml.pdf

    《Professional SQL Server 2005 XML》是针对SQL Server 2005数据库管理系统中XML功能的一本专业指南。这本书深入探讨了SQL Server如何处理XML数据,以及如何利用XML来增强数据库应用的功能和灵活性。以下是一些核心...

    SQL Server 2005 XML应用开发 光盘

    木书简要介绍了XML语言的编写与规范,重点介绍了SQL Server 2005中XML语言的应用,包括XML数据类型、XQuery语言、FOR XML子句、OPENXML函数、XML模板、updategram模板、XML Bulk Load数据批量处理以及XML Web服务等...

    SQL Server 2005盛宴系列之六:新的选择――SQL Server Express 2005.zip

    总的来说,通过"SQL Server 2005盛宴系列之六"的学习,你可以掌握SQL Server Express 2005的基本操作,理解其在实际开发中的作用,以及如何利用它来构建高效、安全的数据驱动应用程序。对于想要入门数据库管理和开发...

    Pro SQL Server 2008 XML 数据库

    《Pro SQL Server 2008 XML》是针对SQL Server 2008数据库系统的一本高级教程,主要聚焦于XML在SQL Server中的应用。XML(eXtensible Markup Language)是一种广泛使用的标记语言,它允许数据以结构化的方式进行存储...

    SQL Server 2000 XML应用程序开发指南

    总结起来,"SQL Server 2000 XML应用程序开发指南"是一本全面介绍如何在SQL Server 2000环境中利用XML进行开发的实用指南。它涵盖了从基础概念到高级技术的各个层面,对于希望深入理解和应用XML的SQL Server开发者来...

Global site tag (gtag.js) - Google Analytics