一、前言

从 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='<"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 声明(如 <"htmlcode">
    select @xmlDoc.query('(books/book/title)[1]')

    运行结果如图:

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

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

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

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

    运行结果如图:

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

    3、查询属性值

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

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

    运行结果如图:

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

    4、使用xpath进行查询

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

    --得到id为0002的book节点

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

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

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

    五、修改操作

             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的后面。运行结果如图:

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

    2、删除节点

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

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

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

    select @xmlDoc

    运行结果如图:

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

    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)')
    
    

    运行结果如图:

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

    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"])')
    
    

    运行结果如图:

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

    如果你想同时向一个节点添加多个属性,你可以使用一个属性的集合来实现,属性的集合可以写成:(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]')
    

    运行结果如图:

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

    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]')
    

    运行结果如图:

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

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

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

标签:
SQL2008,详解直接将XML存入到SQL中,直接将XML存入到SQL中详解

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
狼山资源网 Copyright www.pvsay.com

评论“SQL2008 详解直接将XML存入到SQL中”

暂无“SQL2008 详解直接将XML存入到SQL中”评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。