一、前言

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中XML查询:FOR XML指定PATH

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

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

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

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

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

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

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

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

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

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

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

  8. 浅谈SQL Server中的三种物理连接操作(HASH JOIN MERGE JOIN NESTED LOOP)

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

  9. SQL Server中提前找到隐式转换提升性能的办法

        http://www.cnblogs.com/shanksgao/p/4254942.html 高兄这篇文章很好的谈论了由于数据隐式转换造成执行计划不准确,从而造成了死锁.那如果在事情出现之前 ...

随机推荐

  1. Java实现画八卦

    八卦是由多个圆叠加而成,如果我们让每个圆都有自己的颜色,那么具体结构便一目了然,如下图所示: 显然只要令对应的圆颜色相同,就能达到我们预期的效果. 用Java就能轻松画出来: import java. ...

  2. js实现图片预览

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. Java中的Exception

    Caused by: java.lang.IllegalArgumentException: The servlets named [XXX] and [YYY] are both mapped to ...

  4. Why is applicationhost.config still being added to source control even thought it's in gitignore

      Why is applicationhost.config still being added to source control even thought it's in gitignore g ...

  5. Android编译环境搭建(0818-0819)

    1 在虚拟机VMware上安装64位Ubuntu14.04LTS 首先需要安装虚拟机并激活.然后新建虚拟机,选择使用下载好的Ubuntu镜像.注意需要将光驱改为自己下载的,而不是autoinst.is ...

  6. .NET 自带的动态代理+Expression 实现AOP

    下面代码(摘抄之别处,原创在哪不知)是采用TransparentProxy和RealProxy实现对象的动态代理.碍于其使用反射掉用方法,所以就小试着将反射改成Expression以提高执行的效率.第 ...

  7. 给 Xamarin.Form For Windows Phone APP 加个漂亮的 &quot;头&quot;

    Windows Phone 是那个1%, 我也是那个1%, 不喜勿喷.WP 向来给 android / ios 的粉们一个最直观的印象: 丑.其实"丑"这个东西会一直下去,而且是个 ...

  8. tomcat 6.0.44 &ldquo;has failed to stop it. This is very likely to create a memory leak&rdquo; 问题调查

    1. 问题起因 我们项目中缓存模块某个实现采用了ehcache(2.4.3),当项目部署到tomcat中后,对tomcat做停止服务操作(点击eclipse的console红色的停止按钮,奇怪的是有小 ...

  9. Linux下常用软件

    一, vmtool安装, 进入桌面就后,如果没有看到VMware Tools光盘, 请点击VMware Station菜单栏上的“虚拟机”,然后选择“安装VMware Tools”,就可以在桌面上以看 ...

  10. CSS样式一

    样式 首先明确: HTML标签也有标签的属性,CSS中的样式也称作为属性,而且某些html中的属性与css中的属性同名,并且作用也相同,但是属于不同的技术. 尺寸样式: 几乎所有的标签有可以设置 wi ...