SQL2008 詳解直接將XML存入到SQL中
一、前言
從 SQL Server 2005 開始,就增加了 xml 字段類型,也就是說可以直接把 xml 內(nèi)容存儲在該字段中,并且 SQL Server 會把它當作 xml 來對待,而不是當作 varchar 來對待。
隨著SQL Server 對XML字段的支持,相應的,T-SQL語句也提供了大量對XML操作的功能來配合SQL Server中XML字段的使用。本文主要說明如何使用SQL語句對XML進行操作。
二、定義XML字段
在進行數(shù)據(jù)庫的設(shè)計中,我們可以在表設(shè)計器中,很方便的將一個字段定義為XML類型。需要注意的是,XML字段不能用來作為主鍵或者索引鍵。同樣,我們也可以使用SQL語句來創(chuàng)建使用XML字段的數(shù)據(jù)表,下面的語句創(chuàng)建一個名為“docs”的表,該表帶有整型主鍵“pk”和非類型化的 XML 列“xCol”:
CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)
XML類型除了在表中使用,還可以在存儲過程、事務(wù)、函數(shù)等中出現(xiàn)。下面我們來完成我們對XML操作的第一步,使用SQL語句定義一個XML類型的數(shù)據(jù),并為它賦值:
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 數(shù)據(jù)。
- XML 字段最多可存儲 2G 的數(shù)據(jù)。
- 可以像插入字符串一樣向 XML 字段寫入內(nèi)容。
- 當在 xml 數(shù)據(jù)類型實例中存儲 XML 數(shù)據(jù)時,不會保留 XML 聲明(如 <?xml version='1.0'?>)。
- 插入的 xml 內(nèi)容的屬性的順序可能會與原 xml 實例的順序變化。
- 不保留屬性值前后的單引號和雙引號。
- 不保留命名空間前綴。
- 可以對 XML 字段中的 XML 內(nèi)容建立索引。
- 可以對 XML 字段中的 XML 內(nèi)容建立約束,比如 age 節(jié)點必須大于等于 18。
- 可以通過創(chuàng)建架構(gòu)來對 XML 進行類型化,比如讓 xml 內(nèi)容的 <user> 節(jié)點下面必須有 <fullname> 節(jié)點。
四、查詢操作
在定義了一個XML類型的數(shù)據(jù)之后,我們最常用的就是查詢操作,下面我們來介紹如何使用SQL語句來進行查詢操作的。
在T-Sql中,提供了兩個對XML類型數(shù)據(jù)進行查詢的函數(shù),分別是query(xquery)和value(xquery, dataType),其中,query(xquery)得到的是帶有標簽的數(shù)據(jù),而value(xquery, dataType)得到的則是標簽的內(nèi)容。接下類我們分別使用這兩個函數(shù)來進行查詢。
1、使用query(xquery) 查詢
我們需要得到書的標題(title),使用query(xquery)來進行查詢,查詢語句為:
select @xmlDoc.query('(books/book/title)[1]')
運行結(jié)果如圖:
2、使用value(xquery, dataType) 查詢
同樣是得到書的標題,使用value函數(shù),需要指明兩個參數(shù),一個為xquery, 另一個為得到數(shù)據(jù)的類型??聪旅娴牟樵冋Z句:
select @xmlDoc.value('(books/book/title)[1]', 'nvarchar(max)')
運行結(jié)果如圖:
3、查詢屬性值
無論是使用query還是value,都可以很容易的得到一個節(jié)點的某個屬性值,例如,我們很希望得到book節(jié)點的id,我們這里使用value方法進行查詢,語句為:
select @xmlDoc.value('(books/book/@id)[1]', 'nvarchar(max)')
運行結(jié)果如圖:
4、使用xpath進行查詢
xpath是.net平臺下支持的,統(tǒng)一的Xml查詢語句。使用XPath可以方便的得到想要的節(jié)點,而不用使用where語句。例如,
--得到id為0002的book節(jié)點
select @xmlDoc.query('(/books/book[@id="0002"])')
上面的語句可以獨立運行,它得到的是id為0002的節(jié)點。運行結(jié)果如下
五、修改操作
SQL的修改操作包括更新和刪除。SQL提供了modify()方法,實現(xiàn)對Xml的修改操作。modify方法的參數(shù)為XML修改語言。XML修改語言類似于SQL 的Insert、Delete、UpDate,但并不一樣。
1、修改節(jié)點值
我們希望將id為0001的書的價錢(price)修改為100, 我們就可以使用modify方法。代碼如下:
set @xmlDoc.modify('replace value of (/books/book[@id=0001]/price/text())[1] with "100"')
--得到id為0001的book節(jié)點
select @xmlDoc.query('(/books/book[@id="0001"])')
注意:modify方法必須出現(xiàn)在set的后面。運行結(jié)果如圖:
2、刪除節(jié)點
接下來我們來刪除id為0002的節(jié)點,代碼如下:
--刪除節(jié)點id為0002的book節(jié)點
set @xmlDoc.modify('delete /books/book[@id=0002]')
select @xmlDoc
運行結(jié)果如圖:
3、添加節(jié)點
很多時候,我們還需要向xml里面添加節(jié)點,這個時候我們一樣需要使用modify方法。下面我們就向id為0001的book節(jié)點中添加一個ISBN節(jié)點,代碼如下:
--添加節(jié)點
set @xmlDoc.modify('insert <isbn>78-596-134</isbn> before (/books/book[@id=0001]/price)[1]') select @xmlDoc.query('(/books/book[@id="0001"]/isbn)')
運行結(jié)果如圖:
4、添加和刪除屬性
當你學會對節(jié)點的操作以后,你會發(fā)現(xiàn),很多時候,我們需要對節(jié)點進行操作。這個時候我們依然使用modify方法,例如,向id為0001的book節(jié)點中添加一個date屬性,用來存儲出版時間。代碼如下:
--添加屬性
set @xmlDoc.modify('insert attribute date{"2008-11-27"} into (/books/book[@id=0001])[1]') select @xmlDoc.query('(/books/book[@id="0001"])')
運行結(jié)果如圖:
如果你想同時向一個節(jié)點添加多個屬性,你可以使用一個屬性的集合來實現(xiàn),屬性的集合可以寫成:(attribute date{"2008-11-27"}, attribute year{"2008"}),你還可以添加更多。這里就不再舉例了。
5、刪除屬性
刪除一個屬性,例如刪除id為0001 的book節(jié)點的id屬性,我們可以使用如下代碼:
--刪除屬性
set @xmlDoc.modify('delete books/book[@id="0001"]/@id') select @xmlDoc.query('(/books/book)[1]')
運行結(jié)果如圖:
6、修改屬性
修改屬性值也是很常用的,例如把id為0001的book節(jié)點的id屬性修改為0005,我們可以使用如下代碼:
--修改屬性
set @xmlDoc.modify('replace value of ( books/book[@id="0001"]/@id)[1] with "0005"') select @xmlDoc.query('(/books/book)[1]')
運行結(jié)果如圖:
經(jīng)過上面的學習,相信你已經(jīng)可以很好的在SQL中使用Xml類型了,下面是我們沒有提到的:exist()方法,用來判斷指定的節(jié)點是否存在,返回值為true或false; nodes()方法,用來把一組由一個查詢返回的節(jié)點轉(zhuǎn)換成一個類似于結(jié)果集的表中的一組記錄行。 你可以去MSDN查閱 http://msdn.microsoft.com/zh-cn/library/ms190798.aspx。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 卸載SQL2008遇到問題(重啟計算機失敗、找不到SQL卸載程序)的解決辦法
- sql2008安裝教程 SQL Server 2008 R2 安裝圖解
- SQL2005、SQL2008允許遠程連接的配置說明(附配置圖)
- sql2008 hql語句翻譯過來的分頁語句介紹
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- SQL2008 附加數(shù)據(jù)庫提示 5120錯誤 解決辦法
- 使用Sqlserver事務(wù)發(fā)布實現(xiàn)數(shù)據(jù)同步(sql2008)
- sql2008評估期已過的解決辦法及序列號
- sql2008安裝后服務(wù)器改名造成名稱不一致解決方法
- mssql2008 自定義表類型實現(xiàn)(批量插入或者修改)
- SQL2008 附加數(shù)據(jù)庫提示5120錯誤解決方法
相關(guān)文章
重裝MS SQL Server 2000前必須徹底刪除原安裝文件的方法
重裝MS SQL Server 2000前必須徹底刪除原安裝文件的方法...2007-11-11在Ubuntu使用SQL?Server創(chuàng)建Go應用程序的圖文教程
這篇文章主要給大家介紹了關(guān)于在Ubuntu使用SQL?Server創(chuàng)建Go應用程序的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-04-04sql中的regexp與like區(qū)別實現(xiàn)
本文詳細介紹了正則表達式REGEXP和LIKE語句的用途,使用它們進行模式匹配,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-09-09SQL Server誤區(qū)30日談 第11天 鏡像在檢測到故障后瞬間就能故障轉(zhuǎn)移
數(shù)據(jù)庫鏡像的故障轉(zhuǎn)移既可以自動發(fā)起,也可以手動發(fā)起2013-01-01ROW_NUMBER SQL Server 2005的LIMIT功能實現(xiàn)(ROW_NUMBER()排序函數(shù))
SQL Server 2005新增了一個ROW_NUMBER()函數(shù),通過它可實現(xiàn)類似MySQL下的LIMIT功能。下面的語法說明摘自SQL Server 2005的幫助文件2012-06-06還原Sql?Server數(shù)據(jù)庫BAK備份文件的3種方式以及常見錯誤總結(jié)
日常后端開發(fā)中,我們有時候需要查看之前備份數(shù)據(jù)庫的信息用于排錯糾正項目問題,下面這篇文章主要給大家介紹了關(guān)于還原Sql?Server數(shù)據(jù)庫BAK備份文件的3種方式以及常見錯誤的相關(guān)資料,需要的朋友可以參考下2023-02-02