您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)怎么使用SQL對(duì)Xml字段的操作,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
T-Sql操作Xml數(shù)據(jù)
一、前言
SQL Server 2005 引入了一種稱為 XML 的本機(jī)數(shù)據(jù)類型。用戶可以創(chuàng)建這樣的表,它在關(guān)系列之外還有一個(gè)或多個(gè) XML 類型的列;此外,還允許帶有變量和參數(shù)。為了更好地支持 XML 模型特征(例如文檔順序和遞歸結(jié)構(gòu)),XML 值以內(nèi)部格式存儲(chǔ)為大型二進(jìn)制對(duì)象 (BLOB)。
用戶將一個(gè)XML數(shù)據(jù)存入數(shù)據(jù)庫(kù)的時(shí)候,可以使用這個(gè)XML的字符串,SQL Server會(huì)自動(dòng)的將這個(gè)字符串轉(zhuǎn)化為XML類型,并存儲(chǔ)到數(shù)據(jù)庫(kù)中。
隨著SQL Server 對(duì)XML字段的支持,相應(yīng)的,T-SQL語(yǔ)句也提供了大量對(duì)XML操作的功能來(lái)配合SQL Server中XML字段的使用。本文主要說(shuō)明如何使用SQL語(yǔ)句對(duì)XML進(jìn)行操作。
二、定義XML字段
在進(jìn)行數(shù)據(jù)庫(kù)的設(shè)計(jì)中,我們可以在表設(shè)計(jì)器中,很方便的將一個(gè)字段定義為XML類型。需要注意的是,XML字段不能用來(lái)作為主鍵或者索引鍵。同樣,我們也可以使用SQL語(yǔ)句來(lái)創(chuàng)建使用XML字段的數(shù)據(jù)表,下面的語(yǔ)句創(chuàng)建一個(gè)名為“docs”的表,該表帶有整型主鍵“pk”和非類型化的 XML 列“xCol”:
CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)
XML類型除了在表中使用,還可以在存儲(chǔ)過(guò)程、事務(wù)、函數(shù)等中出現(xiàn)。下面我們來(lái)完成我們對(duì)XML操作的第一步,使用SQL語(yǔ)句定義一個(gè)XML類型的數(shù)據(jù),并為它賦值:
declare @xmlDoc xml; set @xmlDoc='<book id="0001"> <title>C Program</title> <author>David</author> <price>21</price> </book>'
三、查詢操作
在定義了一個(gè)XML類型的數(shù)據(jù)之后,我們最常用的就是查詢操作,下面我們來(lái)介紹如何使用SQL語(yǔ)句來(lái)進(jìn)行查詢操作的。
在T-Sql中,提供了兩個(gè)對(duì)XML類型數(shù)據(jù)進(jìn)行查詢的函數(shù),分別是query(xquery)和value(xquery, dataType),其中,query(xquery)得到的是帶有標(biāo)簽的數(shù)據(jù),而value(xquery, dataType)得到的則是標(biāo)簽的內(nèi)容。接下類我們分別使用這兩個(gè)函數(shù)來(lái)進(jìn)行查詢。
1、使用query(xquery) 查詢
我們需要得到書的標(biāo)題(title),使用query(xquery)來(lái)進(jìn)行查詢,查詢語(yǔ)句為:
select @xmlDoc.query('/book/title')
運(yùn)行結(jié)果如圖:
2、使用value(xquery, dataType) 查詢
同樣是得到書的標(biāo)題,使用value函數(shù),需要指明兩個(gè)參數(shù),一個(gè)為xquery, 另一個(gè)為得到數(shù)據(jù)的類型??聪旅娴牟樵冋Z(yǔ)句:
select @xmlDoc.value('(/book/title)[1]', 'nvarchar(max)')
運(yùn)行結(jié)果如圖:
3、查詢屬性值
無(wú)論是使用query還是value,都可以很容易的得到一個(gè)節(jié)點(diǎn)的某個(gè)屬性值,例如,我們很希望得到book節(jié)點(diǎn)的id,我們這里使用value方法進(jìn)行查詢,語(yǔ)句為:
select @xmlDoc.value('(/book/@id)[1]', 'nvarchar(max)')
運(yùn)行結(jié)果如圖:
4、使用xpath進(jìn)行查詢
xpath是.net平臺(tái)下支持的,統(tǒng)一的Xml查詢語(yǔ)句。使用XPath可以方便的得到想要的節(jié)點(diǎn),而不用使用where語(yǔ)句。例如,我們?cè)贎xmlDoc中添加了另外一個(gè)節(jié)點(diǎn),重新定義如下:
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節(jié)點(diǎn)
select @xmlDoc.query('(/root/book[@id="0002"])')
上面的語(yǔ)句可以獨(dú)立運(yùn)行,它得到的是id為0002的節(jié)點(diǎn)。運(yùn)行結(jié)果如下圖:
四、修改操作
SQL的修改操作包括更新和刪除。SQL提供了modify()方法,實(shí)現(xiàn)對(duì)Xml的修改操作。modify方法的參數(shù)為XML修改語(yǔ)言。XML修改語(yǔ)言類似于SQL 的Insert、Delete、UpDate,但并不一樣。
1、修改節(jié)點(diǎn)值
我們希望將id為0001的書的價(jià)錢(price)修改為100, 我們就可以使用modify方法。代碼如下:
set @xmlDoc.modify('replace value of (/root/book[@id=0001]/price/text())[1] with "100"') --得到id為0001的book節(jié)點(diǎn) select @xmlDoc.query('(/root/book[@id="0001"])')
注意:modify方法必須出現(xiàn)在set的后面。運(yùn)行結(jié)果如圖:
2、刪除節(jié)點(diǎn)
接下來(lái)我們來(lái)刪除id為0002的節(jié)點(diǎn),代碼如下:
--刪除節(jié)點(diǎn)id為0002的book節(jié)點(diǎn) set @xmlDoc.modify('delete /root/book[@id=0002]') select @xmlDoc
運(yùn)行結(jié)果如圖:
3、添加節(jié)點(diǎn)
很多時(shí)候,我們還需要向xml里面添加節(jié)點(diǎn),這個(gè)時(shí)候我們一樣需要使用modify方法。下面我們就向id為0001的book節(jié)點(diǎn)中添加一個(gè)ISBN節(jié)點(diǎn),代碼如下:
--添加節(jié)點(diǎn)
set @xmlDoc.modify('insert <isbn>78-596-134</isbn> before (/root/book[@id=0001]/price)[1]') select @xmlDoc.query('(/root/book[@id="0001"]/isbn)')
運(yùn)行結(jié)果如圖:
4、添加和刪除屬性
當(dāng)你學(xué)會(huì)對(duì)節(jié)點(diǎn)的操作以后,你會(huì)發(fā)現(xiàn),很多時(shí)候,我們需要對(duì)節(jié)點(diǎn)進(jìn)行操作。這個(gè)時(shí)候我們依然使用modify方法,例如,向id為0001的book節(jié)點(diǎn)中添加一個(gè)date屬性,用來(lái)存儲(chǔ)出版時(shí)間。代碼如下:
--添加屬性
set @xmlDoc.modify('insert attribute date{"2008-11-27"} into (/root/book[@id=0001])[1]') select @xmlDoc.query('(/root/book[@id="0001"])')
運(yùn)行結(jié)果如圖:
如果你想同時(shí)向一個(gè)節(jié)點(diǎn)添加多個(gè)屬性,你可以使用一個(gè)屬性的集合來(lái)實(shí)現(xiàn),屬性的集合可以寫成:(attribute date{"2008-11-27"}, attribute year{"2008"}),你還可以添加更多。這里就不再舉例了。
5、刪除屬性
刪除一個(gè)屬性,例如刪除id為0001 的book節(jié)點(diǎn)的id屬性,我們可以使用如下代碼:
--刪除屬性
set @xmlDoc.modify('delete root/book[@id="0001"]/@id') select @xmlDoc.query('(/root/book)[1]')
運(yùn)行結(jié)果如圖:
6、修改屬性
修改屬性值也是很常用的,例如把id為0001的book節(jié)點(diǎn)的id屬性修改為0005,我們可以使用如下代碼:
--修改屬性
set @xmlDoc.modify('replace value of (root/book[@id="0001"]/@id)[1] with "0005"') select @xmlDoc.query('(/root/book)[1]')
運(yùn)行結(jié)果如圖:
OK,經(jīng)過(guò)上面的學(xué)習(xí),相信你已經(jīng)可以很好的在SQL中使用Xml類型了,下面是我們沒(méi)有提到的,你可以去其它地方查閱:exist()方法,用來(lái)判斷指定的節(jié)點(diǎn)是否存在,返回值為true或false; nodes()方法,用來(lái)把一組由一個(gè)查詢返回的節(jié)點(diǎn)轉(zhuǎn)換成一個(gè)類似于結(jié)果集的表中的一組記錄行。
以上就是怎么使用SQL對(duì)Xml字段的操作,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。