SQL2008 详解直接将XML存入到SQL中

一、前言

从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接把 xml 内容存储在该字段中,并且 SQL Server 会把它当作 xml 来对待,而不是当作 varchar 来对待。

随着SQL Server 对XML字段的支持,相应的,T-SQL语句也提供了大量对XML操作的功能来配合SQL Server中XML字段的使用。本文主要说明如何使用SQL语句对XML进行操作。

二、定义XML字段

在进行数据库的设计中,我们可以在表设计器中,很方便的将一个字段定义为XML类型。需要注意的是,XML字段不能用来作为主键或者索引键。同样,我们也可以使用SQL语句来创建使用XML字段的数据表,下面的语句创建一个名为“docs”的表,该表带有整型主键“pk”和非类型化的 XML 列“xCol”:

CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)

XML类型除了在表中使用,还可以在存储过程、事务、函数等中出现。下面我们来完成我们对XML操作的第一步,使用SQL语句定义一个XML类型的数据,并为它赋值:

set @xmlDoc='<?xml version="1.0" ?>

    <books>

       <book id="0001">

<title>C Program</title>

<author>David</author>

<price>21</price>

 </book>

 <book id="0002">

<title>你必须知道的.NET</title>

<author>王涛</author>

<price>79</price>

 </book>

  </books>'

select @xmlDoc

三、XML字段注意点

三、XML字段注意点

  • SQL Server 中以 Unicode(UTF-16) 来存储 XML 数据。
  • XML 字段最多可存储 2G 的数据。
  • 可以像插入字符串一样向 XML 字段写入内容。
  • 当在 xml 数据类型实例中存储 XML 数据时,不会保留 XML 声明(如 <?xml version='1.0'?>)。
  • 插入的 xml 内容的属性的顺序可能会与原 xml 实例的顺序变化。
  • 不保留属性值前后的单引号和双引号。
  • 不保留命名空间前缀。
  • 可以对 XML 字段中的 XML 内容建立索引。
  • 可以对 XML 字段中的 XML 内容建立约束,比如 age 节点必须大于等于 18。
  • 可以通过创建架构来对 XML 进行类型化,比如让 xml 内容的 <user> 节点下面必须有 <fullname> 节点。

四、查询操作

在定义了一个XML类型的数据之后,我们最常用的就是查询操作,下面我们来介绍如何使用SQL语句来进行查询操作的。

在T-Sql中,提供了两个对XML类型数据进行查询的函数,分别是query(xquery)和value(xquery, dataType),其中,query(xquery)得到的是带有标签的数据,而value(xquery, dataType)得到的则是标签的内容。接下类我们分别使用这两个函数来进行查询。

1、使用query(xquery) 查询

我们需要得到书的标题(title),使用query(xquery)来进行查询,查询语句为:

select @xmlDoc.query('(books/book/title)[1]')

运行结果如图:

2、使用value(xquery, dataType) 查询

同样是得到书的标题,使用value函数,需要指明两个参数,一个为xquery, 另一个为得到数据的类型。看下面的查询语句:

select @xmlDoc.value('(books/book/title)[1]', 'nvarchar(max)')

运行结果如图:

3、查询属性值

无论是使用query还是value,都可以很容易的得到一个节点的某个属性值,例如,我们很希望得到book节点的id,我们这里使用value方法进行查询,语句为:

select @xmlDoc.value('(books/book/@id)[1]', 'nvarchar(max)')

运行结果如图:

4、使用xpath进行查询

xpath是.net平台下支持的,统一的Xml查询语句。使用XPath可以方便的得到想要的节点,而不用使用where语句。例如,

--得到id为0002的book节点

select @xmlDoc.query('(/books/book[@id="0002"])')

上面的语句可以独立运行,它得到的是id为0002的节点。运行结果如下

五、修改操作

SQL的修改操作包括更新和删除。SQL提供了modify()方法,实现对Xml的修改操作。modify方法的参数为XML修改语言。XML修改语言类似于SQL 的Insert、Delete、UpDate,但并不一样。

1、修改节点值

我们希望将id为0001的书的价钱(price)修改为100, 我们就可以使用modify方法。代码如下:

set @xmlDoc.modify('replace value of (/books/book[@id=0001]/price/text())[1] with "100"')

--得到id为0001的book节点

select @xmlDoc.query('(/books/book[@id="0001"])')

注意:modify方法必须出现在set的后面。运行结果如图:

2、删除节点

接下来我们来删除id为0002的节点,代码如下:

--删除节点id为0002的book节点

set @xmlDoc.modify('delete /books/book[@id=0002]')

select @xmlDoc

运行结果如图:

3、添加节点

很多时候,我们还需要向xml里面添加节点,这个时候我们一样需要使用modify方法。下面我们就向id为0001的book节点中添加一个ISBN节点,代码如下:

--添加节点

set @xmlDoc.modify('insert <isbn>78-596-134</isbn> before (/books/book[@id=0001]/price)[1]')

select @xmlDoc.query('(/books/book[@id="0001"]/isbn)')

运行结果如图:

4、添加和删除属性

当你学会对节点的操作以后,你会发现,很多时候,我们需要对节点进行操作。这个时候我们依然使用modify方法,例如,向id为0001的book节点中添加一个date属性,用来存储出版时间。代码如下:

--添加属性

set @xmlDoc.modify('insert attribute date{"2008-11-27"} into (/books/book[@id=0001])[1]')

select @xmlDoc.query('(/books/book[@id="0001"])')

运行结果如图:

如果你想同时向一个节点添加多个属性,你可以使用一个属性的集合来实现,属性的集合可以写成:(attribute date{"2008-11-27"}, attribute year{"2008"}),你还可以添加更多。这里就不再举例了。

5、删除属性

删除一个属性,例如删除id为0001 的book节点的id属性,我们可以使用如下代码:

--删除属性

set @xmlDoc.modify('delete books/book[@id="0001"]/@id')

select @xmlDoc.query('(/books/book)[1]')

运行结果如图:

6、修改属性

修改属性值也是很常用的,例如把id为0001的book节点的id属性修改为0005,我们可以使用如下代码:

--修改属性

set @xmlDoc.modify('replace value of ( books/book[@id="0001"]/@id)[1] with "0005"')

select @xmlDoc.query('(/books/book)[1]')

运行结果如图:

经过上面的学习,相信你已经可以很好的在SQL中使用Xml类型了,下面是我们没有提到的:exist()方法,用来判断指定的节点是否存在,返回值为true或false; nodes()方法,用来把一组由一个查询返回的节点转换成一个类似于结果集的表中的一组记录行。 你可以去MSDN查阅  http://msdn.microsoft.com/zh-cn/library/ms190798.aspx。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • sql2008 hql语句翻译过来的分页语句介绍

    sql2008 hql语句翻译过来的分页语句 WITH query AS (select syusers0.id as id5, syusers0.createdatetime as createda25_, syusers0.modifydatetime as modifyda35_, syusers0.name as name5, syusers0.password as password5, ROW_NUMBER() OVER ( order by syusers0.name desc)

  • SQLServer日志清空语句(sql2000,sql2005,sql2008)

    SQL Server日志清空方法 在查询分析器中顺序执行以下三步,其中 databasename 为你的数据库文件名 sql2000日志清空 可以将jb51.ldf文件变得很小,方便备份数据库等,在sqlserver查询分析器中执行即可. 复制代码 代码如下: DUMP TRANSACTION [jb51] WITH NO_LOGBACKUP LOG [jb51] WITH NO_LOGDBCC SHRINKDATABASE([jb51]) 1.清空日志: DUMP TRANSACTION [d

  • mssql2008 自定义表类型实现(批量插入或者修改)

    在做大型网站或者系统的时候,经常会遇到个问题就是批量插入或者修改数据库.如果遇到这个问题,还是一条条记录来处理,这样的效率太低了,所以要考虑批量插入或者修改 今天这边不讲SqlBulkCopy,只简单讲sql自定义表类型.因为目前的项目我用到了分表的方式,用存储过程比较方便自动创建分表.现在把我目前写的功能简单做个记录,也方便以后自己查阅 第一步,在数据库里点击 新建查询 创建相应的sql 复制代码 代码如下: --======自定义表类型Demo====== --创建表 create tabl

  • SQL2005、SQL2008允许远程连接的配置说明(附配置图)

    SQL Server 2005允许远程连接的配置说明 在尝试从远程计算机连接到 Microsoft SQL Server 2005 实例时,可能会接收到错误消息.在使用任何程序连接到 SQL Server 时都可能会发生此问题.例如,在使用 SQLCMD 实用工具连接到 SQL Server 时收到以下错误消息: Sqlcmd:错误:Microsoft SQL Native Client:建立到服务器的连接时发生错误.连接到 SQL Server 2005 时,默认设置 SQL Server 不

  • 卸载SQL2008遇到问题(重启计算机失败、找不到SQL卸载程序)的解决办法

    重启计算机失败.找不到SQL卸载程序问题的解决方法,具体内容如下 问题1:很奇怪,控制面板找不到SQL的卸载程序,后来在网上查知需要修复windows卸载/安装程序,官网下载网址: http://download.microsoft.com/download/7/E/9/7E9188C0-2511-4B01-8B4E-0A641EC2F600/MicrosoftProgram_Install_and_Uninstall.meta.diagcab1.1 下载双击打开后,直接选next 1.2 根据

  • SQL2008 附加数据库提示5120错误解决方法

    前几天在附加数据库时,出现了这个错误 在win7 x64系统上使用sql2008进行附加数据库(包括在x86系统正在使用的数据库文件,直接拷贝附加在X64系统中)时,提示无法打开文件,5120错误. 这个错误是因为没有操作权限,所以附加的时候出错,只要设置这个文件或文件夹安全属性即可.解决办法:    1.打开该数据库文件存放的目录或数据库文件的属性窗口,选择"属性"菜单->选择"安全"标签->选择"编辑"按钮.    2.在选择组或

  • sql2008安装后服务器改名造成名称不一致解决方法

    用select @@servername和select serverproperty('servername')一查看服务器名是否一致 如果不一致,则以serverproperty('servername')为准 解决办法: 复制代码 代码如下: exec sp_dropserver @server = '服务器名' exec sp_addserver @server = '服务器名', @local = 'LOCAL' 重启sql2008数据库服务,后再次检查是否一致

  • sql2008安装教程 SQL Server 2008 R2 安装图解

    一.进入安装程序 插入SQL Server 2008 R2安装光盘,自动运行后出现"SQL Server安装中心". 在这里我们在本机安装一个SQL Server默认实例,所以执行以下步骤: 1.在左侧的目录树中选择"安装". 2.在右侧的选择项中,选择第1项目"全新安装或向现有安装添加功能",然后就进入了安装程序. 二.安装的准备过程 1.安装程序支持规则 在这个准备过程里,首先安装程序要扫描本机的一些信息,用来确定在安装过程中不会出现异常.如

  • 使用Sqlserver事务发布实现数据同步(sql2008)

    事务的功能在sqlserver中由来已久,因为最近在做一个数据同步方案,所以有机会再次研究一下它以及快照等,发现还是有很多不错的功能和改进的.这里以sqlserver2008的事务发布功能为例,对发布订阅的方式简要介绍一下操作流程,一方面做个总结备份,一方面与大家进行一下分享和交流.费话就不多说了,进入一下今天的正题:) 这里要说明一下环境:首先我在本地局域网内有两台安装有sqlserver2008的机器(注意:已发布的快照版本无法向老版本数据库兼容,意味着2008下创建的事务或快照发布,无法被

  • SQL2008 附加数据库提示 5120错误 解决办法

    在win7 x64系统上使用sql2008进行附加数据库(包括在x86系统正在使用的数据库文件,直接拷贝附加在X64系统中)时,提示无法打开文件,5120错误. 是因为没有操作权限,所以附加的时候出错,只要设置这个文件或文件夹安全属性即可. 解决办法: 1.打开该数据库文件存放的目录或数据库文件的属性窗口,选择"属性"菜单->选择"安全"标签->选择"编辑"按钮. 2.在选择组或用户名列表中,选择Authenticated Users

  • sql2008评估期已过的解决办法及序列号

    操作如下:(1)将SQL安装光盘(或者ISO)放进去运行,进入安装界面. (也可进入开始>程序>Microsoft SQL Server 2008>配置工具>SQL Server 安装中心)(2)选择"维护"中的"版本升级",(3)按照版本升级的向导,先输入产品密钥,也就是正式企业版的序列号:(4)然后选择要升级的数据库实例,当然这里虚拟机中只有一个实例所以也不用选择了,一直进行向导的"下一步",最后点击"升级&

随机推荐