`
li_hy2002
  • 浏览: 11518 次
  • 性别: 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

    SQLServer20052008 XML数据类型操作

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

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

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

    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操作更加简便高效。

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

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

    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数据时具备了更高...

    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服务...

    win7完美卸载sqlserver2005图解

    在 Windows 7 操作系统中,卸载 SQL Server 2005 可能会遇到一些麻烦,因为 SQL Server 2005 的组件都是分散的,需要一个一个卸载,否则可能会导致重新安装不成功。下面将逐步介绍卸载 SQL Server 2005 的方法。 ...

    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的基本操作,理解其在实际开发中的作用,以及如何利用它来构建高效、安全的数据驱动应用程序。对于想要入门数据库管理和开发...

    SQL server2005(百度云下载哦)包含64位和32位的安装包

    5. **XML支持**:SQL Server 2005内建对XML的支持,可以将XML数据存储为第一类公民,并提供了处理XML数据的内置函数。 6. **分析和报表**:SQL Server Analysis Services支持多维数据集和数据挖掘,而Reporting ...

    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