原文轉自: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')
運行結果如圖:
二、使用value(xquery, dataType) 查詢
一樣是獲得書的標題,使用value函數,須要指明兩個參數,一個爲xquery, 另外一個爲獲得數據的類型。看下面的查詢語句:
select @xmlDoc.value('(/book/title)[1]', 'nvarchar(max)')
運行結果如圖:
三、查詢屬性值
不管是使用query仍是value,均可以很容易的獲得一個節點的某個屬性值,例如,咱們很但願獲得book節點的id,咱們這裏使用value方法進行查詢,語句爲:
select @xmlDoc.value('(/book/@id)[1]', 'nvarchar(max)')
運行結果如圖:
四、使用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的節點。運行結果以下圖:
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的後面。運行結果如圖:
二、刪除節點
接下來咱們來刪除id爲0002的節點,代碼以下:
--刪除節點id爲0002的book節點
set @xmlDoc.modify('delete /root/book[@id=0002]')
select @xmlDoc
運行結果如圖:
三、添加節點
不少時候,咱們還須要向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)')
運行結果如圖:
四、添加和刪除屬性
當你學會對節點的操做之後,你會發現,不少時候,咱們須要對節點進行操做。這個時候咱們依然使用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"])')
運行結果如圖:
若是你想同時向一個節點添加多個屬性,你可使用一個屬性的集合來實現,屬性的集合能夠寫成:(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]')
運行結果如圖:
六、修改屬性
修改屬性值也是很經常使用的,例如把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]')
運行結果如圖:
OK,通過上面的學習,相信你已經能夠很好的在SQL中使用Xml類型了,下面是咱們沒有提到的,你能夠去其它地方查閱:exist()方法,用來判斷指定的節點是否存在,返回值爲true或false; nodes()方法,用來把一組由一個查詢返回的節點轉換成一個相似於結果集的表中的一組記錄行。