一、前言

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进行操作的更多相关文章

  1. (4.31)sql server中的xml数据操作

    关键词:xml数据转为行列方式显示 常规案例: declare @data xml declare @h int set @data=' <bookstore> <row> & ...

  2. SQL Server 2008 对XML 数据类型操作

    原文 http://www.cnblogs.com/qinjian123/p/3240702.html 一.前言 从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接 ...

  3. SQL Server 中对 FOR XML和FROM的转换处理

    在SQL Server中对XML的再操作转换: 方法1: --生成XML SELECT * FROM [T_BAS_预算科目] FOR XML PATH --把XML转成SQL表 declare @X ...

  4. SQL SERVER中XML查询:FOR XML指定PATH

    SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指 ...

  5. SQL SERVER中变量的定义、赋值与使用

      本文面向对SQL SERVER中变量操作不熟悉的用户,希望能使他们在看完本文后能对变量操作有具体和全面的认识.   在学习SQL SERVER的过程中,很多时候需要对某些单独的值进行调试,这时就需 ...

  6. SQL Server中的Image数据类型的操作

    原文:SQL Server中的Image数据类型的操作 准备工作,在库Im_Test中建立一张表Im_Info,此表中有两个字段,分别为Pr_Id (INT),Pr_Info (IMAGE),用来存储 ...

  7. 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行

    错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...

  8. 多个程序对sql server中的表进行查询和插入操作导致死锁

    最近在做一个项目,是要用多个程序对sql server中的相同的数据库进行操作(查询和插入),所以在开始的时候常会出现死锁问题,后来在网上进行了咨询,发现了一些解决方法,留作大家参考: 并发去操纵一张 ...

  9. 浅谈SQL Server中的三种物理连接操作

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

随机推荐

  1. CentOS下安装使用start-stop-daemon

    CentOS下安装使用start-stop-daemon 在centos下下了个自启动的服务器脚本 执行的时候发现找不到start-stop-daemon命令 好吧 执行手动编译一下 加上这个命令 w ...

  2. 苹果 OS X 系统U盘重装-抹盘重装、系统盘制作

    鉴于前段时间系统出了点问题,然后直接将盘抹了,来个彻底干净的系统重装.这里敲下过程.(网络恢复太慢了,我整整一个晚上竟然没down下来,恼怒了,直接U盘装) First,系统盘制作: 1.首先需要有: ...

  3. 使用GIT进行源码管理 —— 在VisualStudio中使用GIT

    GIT作为源码管理的方式现在是越来越流行了,在VisualStudio 2012中,就通过插件的现实对GIT进行了官方支持,并且这个插件在VS2013中已经转正.本文在这里简单的介绍一下如何在Visu ...

  4. Java和PHP哪个方向更有前途?

      Java和PHP到底哪个方向更有前途呢?我从网络上收集了很多资料,并在这篇文章中做了总结.   1.TIOBE语言排行榜 Apr 2014 Apr 2013 Change Programming ...

  5. GitLab CI持续集成配置方案

    目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 GitLab持续集成所需环境 2.4 需要了解 ...

  6. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

  7. Elixir 1.0 Release

    如期而至,9.9苹果产品发布会之后,紧接着在今天(教师节)我们终于等到了Elixir 1.0,苹果范儿的说法是:Now,Elixir 1.0 is here   注意:官网上的链接说明之类还没有更新过 ...

  8. centos7中没有安装ifconfig命令的解决方法

    初装centos 7时,运行config报 command not found 错误,我在网上找了大量资料,下面的资料中查找原因和解决方式最详细,能很好的解决这个问题. ifconfig命令是设置或显 ...

  9. SQL语句查数据库中某一列是否有重复项

    Select 列名,COUNT(列名)FROM 表名GROUP BY 列名HAVING COUNT( 列名 ) 〉1

  10. kd树和knn算法的c语言实现

    基于kd树的knn的实现原理可以参考文末的链接,都是一些好文章. 这里参考了别人的代码.用c语言写的包括kd树的构建与查找k近邻的程序. code: #include<stdio.h> # ...