一、前言

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
     ';
 --修改数目编号为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
     ';
 --添加属性
 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
     ';
 --在编号为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
     ';
 --删除节点
 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
     ';
 --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
      --判断是否存在

如图:

四、xml xpath

 ) ));
 ','MSSQLServer2005'); --书名MSSQLServer2005
 ','MSSQLServer2008'); --书名MSSQLServer2008
 ','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');
 ,,'');

如图:

五、跨域操作

 --根据Books 表中的ID,Xml_Table 表中的XmlData ID属性  修改对应的 title属性
 --即:根据在books中编码0001的 的名称 MSSQLServer2005
 --修改为Xml_Table表中book编码为0001的title为 MSSQLServer2005

 declare @data xml
 )
 )
 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
 )
  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. SQL Server 2008 对XML 数据类型操作

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    来源:https://msdn.microsoft.com/zh-cn/library/dn144699.aspx 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Out ...

随机推荐

  1. 分布式监控系统Zabbix-3.0.3-完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  2. [MS SQL Server]SQL Server如何开启远程访问

    在日常工作中,经常需要连接到远程的MS SQL Server数据库中.当然也经常会出现下面的连接错误. 解决方法: 1. 设置数据库允许远程连接,数据库实例名-->右键--->属性---C ...

  3. CF461B Appleman and Tree (树DP)

    CF462D Codeforces Round #263 (Div. 2) D Codeforces Round #263 (Div. 1) B B. Appleman and Tree time l ...

  4. JDBC增删改查,PreparedStatement和Statement的区别

    此篇是在上一篇的基础上使用PreparedStatement对象来实现JDBC增删改查的 具体工具类JDBCTools和实现类和配置文件在上一篇Statement对象实现的时候有写. 上一篇地址htt ...

  5. 了解Browserify

    Browserify是一个Javascript的库,可以用来把多个Module打包到一个文件中,并且能很好地应对Modules之间的依赖关系.而Module是封装了属性和功能的单元,是一个Javasc ...

  6. 增强型for循环,用于遍历数组元素

    /** * */ package com.cn.u4; /** * @author Administrator *增强型for */ public class ZhengQiangFor { publ ...

  7. java package and import

    1.Package Package类的主要作用是解决命名冲突.package中所存放的所有文件,一般分一下就分这三种 1,java程序源文件,扩展名为.java. 2,编译好的java类文件,扩展名为 ...

  8. Java中的Redis应用

    1.配置redis集群   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0" encoding ...

  9. Python之jieba库的使用

    jieba库,它是Python中一个重要的第三方中文分词函数库. 1.jieba的下载 由于jieba是一个第三方函数库,所以需要另外下载.电脑搜索“cmd”打开“命令提示符”,然后输入“pip in ...

  10. 国内的go get问题的解决

    在国内采用go get有时会下载不到一些网站如golang.org的依赖包. 方法1(亲测有效): gopm 代替go 下载第三方依赖包可以采用gopm从golang.org一些镜像网站上下载. 注意 ...