(轉載)sql server xml字段的操做

原文轉自:http://blog.csdn.net/hliq5399/article/details/8315373html

另外可參考:https://msdn.microsoft.com/en-us/library/ms175466.aspxnode

 

今天用到sql server 的xml字段,首先这个项目中的xml字段都存为了ntext字段,因此第一个操做 ntext 转化为 xml sql

如下摘自数据库

http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/09/18/sql2005-nvarchar-to-xml.aspx函数

 

XmlString是一個NText欄位,裡面放存放的內容來自*.xml的讀取內容,試著將XmlStringCol轉成XML會發生錯誤:学习

SELECT TOP 1 CONVERT(XML, XmlString) FROM myTable.net

Msg 9402, Level 16, State 1, Line 1
XML parsing: line 1, character 38, unable to switch the encoding设计

經過一番測試,總算明白問題出在哪了。從*.xml中讀出的內容,第一列放的是XML宣告<?xml version="1.0" encoding="UTF-8"?>,而記得嗎? SQL中一贯是用UCS-2儲存資料的,這造成一個矛盾: 明明Encoding是UCS-2,但XML內容卻又宣稱本身是UTF-8,導致了轉換失敗。server

我想到的解決方法是去掉encoding屬性,讓SQL自行看著辦,但由於欄位是NText,必須要轉成NVarChar(MAX)才可動用Replace狸貓換太子,於是指令要改为:xml

SELECT TOP 1 CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlString), 'encoding="UTF-8"', '')) FROM myTable

 

上面的内容解释的不错,就很少废话了,下面就是xml字段的操做了

http://www.cnblogs.com/youring2/archive/2008/11/27/1342288.html

T-Sql操做Xml数据

1、前言

SQL Server 2005 引入了一种称为 XML 的本机数据类型。用户能够建立这样的表,它在关系列以外还有一个或多个 XML 类型的列;此外,还容许带有变量和参数。为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值之内部格式存储为大型二进制对象 (BLOB)。

用户将一个XML数据存入数据库的时候,可使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中。

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

2、定义XML字段

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

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

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

declare @xmlDoc xml;

set @xmlDoc='<book id="0001">

<title>C Program</title>

<author>David</author>

<price>21</price>

</book>'

3、查询操做

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

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

一、使用query(xquery) 查询

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

select @xmlDoc.query('/book/title')

运行结果如图:

clip_image001

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

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

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

运行结果如图:

clip_image002

三、查询属性值

不管是使用query仍是value,均可以很容易的获得一个节点的某个属性值,例如,咱们很但愿获得book节点的id,咱们这里使用value方法进行查询,语句为:

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

运行结果如图:

clip_image003

四、使用xpath进行查询

xpath是.net平台下支持的,统一的Xml查询语句。使用XPath能够方便的获得想要的节点,而不用使用where语句。例如,咱们在@xmlDoc中添加了另一个节点,从新定义以下:

set @xmlDoc='<root>

<book id="0001">

<title>C# Program</title>

<author>Jerry</author>

<price>50</price>

</book>

<book id="0002">

<title>Java Program</title>

<author>Tom</author>

<price>49</price>

</book>

</root>'

--获得id为0002的book节点

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

上面的语句能够独立运行,它获得的是id为0002的节点。运行结果以下图:

clip_image001[6]

4、修改操做

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

一、修改节点值

咱们但愿将id为0001的书的价钱(price)修改成100, 咱们就可使用modify方法。代码以下:

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

--获得id为0001的book节点

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

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

clip_image005

二、删除节点

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

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

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

select @xmlDoc

运行结果如图:

clip_image007

三、添加节点

不少时候,咱们还须要向xml里面添加节点,这个时候咱们同样须要使用modify方法。下面咱们就向id为0001的book节点中添加一个ISBN节点,代码以下:

--添加节点

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

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

运行结果如图:

clip_image008

四、添加和删除属性

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

--添加属性

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

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

运行结果如图:

clip_image010

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

五、删除属性

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

--删除属性

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

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

运行结果如图:

clip_image011

六、修改属性

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

--修改属性

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

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

运行结果如图:

clip_image012

OK,通过上面的学习,相信你已经能够很好的在SQL中使用Xml类型了,下面是咱们没有提到的,你能够去其它地方查阅:exist()方法,用来判断指定的节点是否存在,返回值为true或false; nodes()方法,用来把一组由一个查询返回的节点转换成一个相似于结果集的表中的一组记录行。

相关文章
相关标签/搜索