sql server中对xml进行操作
一、前言
SQL Server 2005 引入了一种称为 XML 的本机数据类型。用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列;此外,还允许带有变量和参数。为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB)。
用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中。
随着SQL Server 对XML字段的支持,相应的,T-SQL语句也提供了大量对XML操作的功能来配合SQL Server中XML字段的使用。本文主要说明如何使用SQL语句对XML进行操作。(以上摘自Qi Fei's Blog)
首先要明确一个基本原则,XML类型的数据之间以及XML类型与其它数据类型之间都是不能比较的,也就是说XML类型的数据不能出现在等号的任何一边。
大致可分为查询类,修改类和跨域查询类。
查询类包含query(),value(),exist()和nodes().
修改类包含modify().
跨域查询类包含sql:variable()和sql:column().
二、创建XML自定义数据库表
创建xml自定义表:以前在网上查的都是
declare @xmlDoc xml;
set @xmlDoc='<book id="0001">
<title>C Program</title>
<author>David</author>
<price>21</price>
</book>' 这样的,但是这仅仅是学习,不能真正用在项目或实际中缺乏实践性。因为很少有直接操作sql内存中的这些。
闲话少说,直接上SQL创建表语句
--1、创建xml测试数据库表Xml_Table Author:Fly , Email:feifei12300@126.com
use Fly_Test --测试数据库
go
create table Xml_Table(ID INT identity PRIMARY KEY, XmlData XML);
--2、插入测试数据
insert into Xml_Table(XmlData) values
('<book id="0001">
<title>SqlServer2005</title>
<author>Fly</author>
<price>21</price>
</book>
');
insert into Xml_Table(XmlData) values
('<book id="0002">
<title>SqlServer2008</title>
<author>Fly</author>
<price>22</price>
</book>
');
insert into Xml_Table(XmlData) values
('<book id="0003">
<title>SqlServer2012</title>
<author>Fly</author>
<price>23</price>
</book>
');
--3、查询
select * from Xml_Table;
结果如图:
三、对xml操作
对xml操作,也不做过多解析,如有不清晰的可以联系我;Emil:feifei12300@126.com
需要注意的是给每个节点添加属性或者添加节点的时候如果已经存在的会报错,所以最好是先exist('你的条件')=0 一下;
--4、对XML操作真正开始了
--SQLServer2005 中对 XML 的处理功能显然增强了很多,提供了 query(),value(),exist(),modify(),nodes()
--查询所有书的名称及作者
select XmlData.query('/book') as Title,XmlData.query('/book/author') as Author from Xml_Table;
--显然这不是我们想要的数据
select XmlData.value('(/book/title)[1]','nvarchar(max)') as Title,
XmlData.value('(/book/author)[1]','nvarchar(max)') as Author from Xml_Table;
--查询数目编号为0001的书的信息
select XmlData.value('(/book/title)[1]','nvarchar(max)') as Title,
XmlData.value('(/book/@id)[1]','nvarchar(max)') as BookID from Xml_Table
where XmlData.value('(/book/@id)[1]','nvarchar(max)') = '';
--修改数目编号为0001 的价格为 11
update Xml_Table
set XmlData.modify('replace value of (/book[@id="0001"]/price/text())[1] with "11"');
--修改 所有的数目作者为Fly_12300
update Xml_Table
set XmlData.modify('replace value of (/book/author/text())[1] with "Fly_12300"')
--查看是否编号为0001的价格修改为11,且所有作者修改为Fly_12300
select XmlData.value('(/book/price)[1]','nvarchar(max)') as Title,
XmlData.value('(/book/@id)[1]','nvarchar(max)') as BookID,
XmlData.value('(/book/author)[1]','nvarchar(max)') as Author from Xml_Table
where XmlData.value('(/book/@id)[1]','nvarchar(max)') = '';
--添加属性
update Xml_Table
set XmlData.modify('insert attribute isbn {"12300321"} into (/book)[1]');
--查看是否存在属性isbn
select XmlData.value('(/book/@isbn)[1]','nvarchar(max)') as isbn,
XmlData.value('(/book/@id)[1]','nvarchar(max)') as BookID from Xml_Table
where XmlData.value('(/book/@id)[1]','nvarchar(max)') = '';
--在编号为0001的添加子节点 category 为 Computer 的分类
update Xml_Table
set XmlData.modify('insert <category>Computer</category> before (/book[@id=0001]/author)[1]');
--查看是否添加了category节点
select XmlData.value('(/book/category)[1]','nvarchar(max)') as category,
XmlData.value('(/book/@id)[1]','nvarchar(max)') as BookID,XmlData from Xml_Table
where XmlData.value('(/book/@id)[1]','nvarchar(max)') = '';
--删除节点
update Xml_Table
set XmlData.modify('delete /book[@id=0001]/category');
--查看是否删除了category节点
select XmlData.value('(/book/category)[1]','nvarchar(max)') as category,
XmlData.value('(/book/@id)[1]','nvarchar(max)') as BookID,XmlData from Xml_Table
where XmlData.value('(/book/@id)[1]','nvarchar(max)') = '';
--nodes() 查询 book的编码
select ids.value('@id', 'varchar(max)'),ids.value('(title)[1]','nvarchar(max)') title from Xml_Table
CROSS APPLY XmlData.nodes('//book') as X(ids) ;
--exist()
select XmlData.value('(/book/@id)[1]','nvarchar(max)') as BookID
from Xml_Table
where XmlData.exist('(/book/@id)')=1 --判断是否存在
如图:
四、xml xpath
create table Books(ID nvarchar(32) not null,Name nvarchar(64));
insert into Books values ('','MSSQLServer2005'); --书名MSSQLServer2005
insert into Books values ('','MSSQLServer2008'); --书名MSSQLServer2008
insert into Books values ('','MSSQLServer2012'); --书名MSSQLServer2012
--以下为xml path
SELECT ID,NAME FROM [dbo].[Books] FOR XML AUTO;
SELECT ID,NAME FROM [dbo].[Books] FOR XML AUTO ,ELEMENTS ,ROOT('books');
SELECT ID as 'BookID',NAME as 'BookName' FROM [dbo].[Books] FOR XML RAW;
SELECT ID,NAME FROM [dbo].[Books] FOR XML RAW('book') ,ELEMENTS ,ROOT('books');
SELECT ID,NAME FROM [dbo].[Books] FOR XML PATH('') ;
SELECT ID as 'Detail/@ID',NAME as 'Detail/Name' FROM [dbo].[Books] FOR XML PATH('Book'), ROOT('Books');
SELECT STUFF((SELECT ';' + Name FROM [dbo].[Books] FOR XML PATH('')),1,1,'');
如图:
五、跨域操作
--根据Books 表中的ID,Xml_Table 表中的XmlData ID属性 修改对应的 title属性
--即:根据在books中编码0001的 的名称 MSSQLServer2005
--修改为Xml_Table表中book编码为0001的title为 MSSQLServer2005 declare @data xml
declare @id nvarchar(36)
declare @name nvarchar(64)
declare custore_name cursor for
select Books.ID,Xml_Table.XmlData,Books.Name
from Books,Xml_Table
where Books.ID= Xml_Table.XmlData.value('(/book/@id)[1]','nvarchar(max)');
OPEN custore_name
FETCH NEXT FROM custore_name into @id, @data, @name
WHILE(@@FETCH_STATUS=0)
BEGIN
set @data.modify(('replace value of (/book/title/text())[1] with sql:variable("@name")'))
update Xml_Table set XmlData = @data where XmlData.value('(/book/@id)[1]','nvarchar(max)') = @id
FETCH NEXT FROM custore_name into
@id, @data, @name
END
CLOSE custore_name
deallocate custore_name select * from Xml_Table
如图所示:

六、结束语
需要注意点:添加、修改属性或者节点需要先判断是否存在(exist);跨域操作时使用了游标,不熟悉的可以自己查阅相关资料。
最后说明:转载请注明出处;
新手学习,高手忽略不计即可;
.net技术交流群:;
sql server中对xml进行操作的更多相关文章
- (4.31)sql server中的xml数据操作
关键词:xml数据转为行列方式显示 常规案例: declare @data xml declare @h int set @data=' <bookstore> <row> & ...
- SQL Server 2008 对XML 数据类型操作
原文 http://www.cnblogs.com/qinjian123/p/3240702.html 一.前言 从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接 ...
- SQL Server 中对 FOR XML和FROM的转换处理
在SQL Server中对XML的再操作转换: 方法1: --生成XML SELECT * FROM [T_BAS_预算科目] FOR XML PATH --把XML转成SQL表 declare @X ...
- SQL SERVER中XML查询:FOR XML指定PATH
SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指 ...
- SQL SERVER中变量的定义、赋值与使用
本文面向对SQL SERVER中变量操作不熟悉的用户,希望能使他们在看完本文后能对变量操作有具体和全面的认识. 在学习SQL SERVER的过程中,很多时候需要对某些单独的值进行调试,这时就需 ...
- SQL Server中的Image数据类型的操作
原文:SQL Server中的Image数据类型的操作 准备工作,在库Im_Test中建立一张表Im_Info,此表中有两个字段,分别为Pr_Id (INT),Pr_Info (IMAGE),用来存储 ...
- 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行
错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...
- 多个程序对sql server中的表进行查询和插入操作导致死锁
最近在做一个项目,是要用多个程序对sql server中的相同的数据库进行操作(查询和插入),所以在开始的时候常会出现死锁问题,后来在网上进行了咨询,发现了一些解决方法,留作大家参考: 并发去操纵一张 ...
- 浅谈SQL Server中的三种物理连接操作
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
随机推荐
- iOS HTTP访问网络受限
HTTP访问网络受限,只需要在项目工程里的Info.plist添加 <key>NSAppTransportSecurity</key> <dict> <key ...
- Laravel大型项目系列教程(四)显示文章列表和用户修改文章
小编心语:不知不觉已经第四部分了,非常感谢很多人给小编提的意见,改了很多bug,希望以后能继续帮小编找找茬~小编也不希望误导大家~这一节,主要讲的 是如何显示文章列表和让用户修改文章,小编预告一下(一 ...
- java 执行 jar 包中的 main 方法
java 执行 jar 包中的 main 方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多 ...
- 基于ARM处理器的反汇编器软件简单设计及实现
写在前面 2012年写的毕业设计,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性 ...
- ab
ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed ...
- zabbix-3.0.3 mysql表分区的方法
目的:解决mysql空间越来越大,mysql性能出现瓶颈,zabbix会无端出现大量agent超时报警 中间遇到一个mysql问题:5.1版本的mysql不支持分表(其实是支持的,需要重新编译mysq ...
- mysql的缓冲查询和非缓冲查询
最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- 内网劫持渗透新姿势:MITMf简要指南
声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...
- javascript的ajax
AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...