SQL Server2005的XML數(shù)據(jù)類型之基礎(chǔ)篇(2)_Mssql數(shù)據(jù)庫(kù)教程
推薦:刪除數(shù)據(jù)庫(kù)中重復(fù)數(shù)據(jù)的幾個(gè)方法方法一 以下為引用的內(nèi)容: declare @max integer,@id integer declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段
value方法
當(dāng)你不想解釋整個(gè)查詢的結(jié)果而只想得到一個(gè)標(biāo)量值時(shí),這個(gè)value方法是很有幫助的。這個(gè)value方法用于查詢XML并且返回一個(gè)原子值。
這個(gè)value方法的語法如下:
value(XQuery,datatype)
借助于value方法,你可以從XML中得到單個(gè)標(biāo)量值。為此,你必須指定XQuery語句和你想要它返回的數(shù)據(jù)類型,并且你可以返回除了XML數(shù)
據(jù)類型外的任何數(shù)據(jù)類型。例如,如果你想得到每一個(gè)小組中的第一個(gè)投球手的名字,你可以編寫如下形式的查詢語句:
進(jìn)行一次查詢以得到單個(gè)值
| 以下為引用的內(nèi)容: SELECT TeamDoc.value( '(/Team/Players/Pitcher/@name)[1]', 'nvarchar(max)') AS FirstPitcher FROM Team |
在每一個(gè)小組的第一個(gè)投球手的標(biāo)量值中的這個(gè)查詢結(jié)果返回值如下:
| 以下為引用的內(nèi)容: FirstPitcher ------------------------------ John Smoltz (1 row(s) affected) |
注意,query和value方法之間的不同在于,query方法返回一個(gè)XML數(shù)據(jù)類型-它包含查詢的結(jié)果;而value方法返回一個(gè)帶有查詢結(jié)果的非
XML數(shù)據(jù)類型。另外,value方法僅能返回單個(gè)值(或標(biāo)量值)。如果你試圖創(chuàng)建一個(gè)使用value方法返回多于一個(gè)值的XQuery表達(dá)式,你將得到一
個(gè)錯(cuò)誤。
modify方法
盡管XQuery標(biāo)準(zhǔn)并沒有提供一種更新XML的機(jī)制,但是SQL Server 2005提供了一種方法用于即時(shí)地修改一個(gè)XML對(duì)象的一部分。這意味著,
你不必僅為了修改而檢索一個(gè)完整的XML文檔。為了即時(shí)修改一個(gè)文檔,你可以采用一種結(jié)合方式-Modify方法和SQL Server 2005的新的XML數(shù)
據(jù)修改語言(XML DML)。
Modify方法的語法是:
modify(<XMLDML>)
該方法僅使用一個(gè)參數(shù):XML DML語句。XML DML也類似于SQL的insert,update和delete語法,但是并不一樣。例如,你可以通過使用
insert DML語句來修改XML:
| 以下為引用的內(nèi)容: SET @doc.modify(' insert <Pitcher name="Jaret Wright"/> as last into (/Team/Players)[1] ') |
另外,你還可以通過調(diào)用一個(gè)UPDATE語句并修改一個(gè)XML列來實(shí)現(xiàn)同樣目的:
修改一個(gè)XML文檔而不完全替換它:
| 以下為引用的內(nèi)容: UPDATE Team SET TeamDoc.modify(' insert <Pitcher name="Jaret Wright"/> as last into (/Team/Players)[1] ') WHERE TeamDoc.exist('/Team[@name="Braves"]') = 1 |
注意,在這個(gè)UPDATE語句中的SET子句并不遵循你過去編寫SQL時(shí)所使用的SET x = y 模式。該語法假定,你能夠提供一個(gè)完全新的值來代
替舊值-這在XML情況下意味著要使用一個(gè)完全新的文檔來代替舊文檔。當(dāng)使用XML類型時(shí),Modify方法可以即時(shí)修改原始文檔。也就是說,對(duì)于
SQL Server來說,不必要對(duì)每一次修改都試圖替換整個(gè)文檔。在本例中的SET語法反映了一種即時(shí)修改一個(gè)文檔的更為有效的方式。
共有三種XML DML語句:insert,update和delete。這三個(gè)語句分別用于插入,更新和刪除一個(gè)XML對(duì)象的部分。每一個(gè)方法的語法類似于
SQL,但是也有一些明顯的差別。
下面是相應(yīng)于insert語句的語法:
| 以下為引用的內(nèi)容: insert InsertExpression ( {{as first | as last} into | after | before} LocationExpression ) |
緊跟著這個(gè)insert語句的是你想要插入的XML(InsertExpression)。接下來,你需要指定你想怎樣插入該XML。你的選擇是into,after或
before。其中,before和after子句指令數(shù)據(jù)庫(kù)把InsertExpression作為L(zhǎng)ocationExpression的一個(gè)兄弟(sibling)插入。before或after則指
定是在LocationExpression的前面還是后面插入它:
| 以下為引用的內(nèi)容: SET @doc.modify(' insert <Pitcher role="Starter" name="Jaret Wright"/> before (/Team/Players/Pitcher)[1] ') |
這個(gè)into子句把InsertExpression作為L(zhǎng)ocationExpression的一個(gè)孩子結(jié)點(diǎn)插入�?蛇x子句as first和as last用于指定在該孩子結(jié)點(diǎn)中插
入的位置:
在小組內(nèi)進(jìn)行插入
| 以下為引用的內(nèi)容: SET @doc.modify(' insert <Pitcher role="Starter" name="Jaret Wright"/> into (/Team/Players)[1] ') |
在小組內(nèi)進(jìn)行插入,指定它應(yīng)該
作為最后一個(gè)元素插入
| 以下為引用的內(nèi)容: SET @doc.modify(' insert <Pitcher role="Starter" name="Jaret Wright"/> as last into (/Team/Players)[1] ') |
delete語句的語法很直接:
delete LocationExpression
這個(gè)LocationExpression指定要從XML數(shù)據(jù)中刪除什么內(nèi)容。例如,要?jiǎng)h除所有的投球手:
SET @doc.modify('delete/Team/Player/Pitcher')
因?yàn)椴樵冎付ㄋ械耐肚蚴衷�,所以它們將被全部刪除。如果你想僅刪除一個(gè)元素,那么你可以指定標(biāo)識(shí)屬性。例如,為了僅刪除投球
手John Smoltz,你可以編寫如下的delete語句:
| 以下為引用的內(nèi)容: SET @doc.modify(' delete /Team/Players/Pitcher[@name="John Smoltz"] ') |
你可以使delete語句刪除單個(gè)屬性。例如,為了刪除針對(duì)投球手John Smoltz的role屬性,相應(yīng)的XML DML看上去如下所示:
| 以下為引用的內(nèi)容: SET @doc.modify(' delete /Team/Players/Pitcher[ @name="John Smoltz"]/@role') |
最后,replace value語句描述了對(duì)XML數(shù)據(jù)的修改。這個(gè)replace value語句的語法如下:
| 以下為引用的內(nèi)容: replace value of OriginalExpression with ReplacementValue | if |
這個(gè)replace value語句用來修改在XML中的值。唯一可能的值是一個(gè)標(biāo)簽的內(nèi)容或一個(gè)屬性的值。這個(gè)OriginalExpression必須解析為單
個(gè)結(jié)點(diǎn)或?qū)傩�。這個(gè)ReplacementValue通常是一個(gè)要代替的值。代替一個(gè)結(jié)點(diǎn)的內(nèi)容要求使用text()函數(shù)的XQuery表達(dá)式來指定你想代替一個(gè)
結(jié)點(diǎn)的文本。例如,為了替換一個(gè)投球手的內(nèi)部文本(inner text),你可以編寫類似如下的Modify語句:
| 以下為引用的內(nèi)容: DECLARE @doc XML SELECT @doc = ' <Team name="Braves"> <Players> <Pitcher name="John Smoltz" role="Closer"> With team since 1989 </Pitcher> </Players> </Team>' SET @doc.modify(' replace value of (/Team/Players/Pitcher[ @name="John Smoltz"]/text())[1] with "May start in 2005" ') |
修改屬性是直接的:你只需要使用XQuery表達(dá)式來解析單個(gè)屬性。例如,為了使用"Starter"替換投球手John Smoltz的role屬性的值,你
可以編寫如下的語句:
| 以下為引用的內(nèi)容: SET @doc.modify(' replace value of (/Team/Players/Pitcher[ @name="John Smoltz"]/@role)[1] with "Starter" ') |
replace value語法也支持條件替換,這可以通過在replace value語句的with子句內(nèi)使用if…then…else語法實(shí)現(xiàn)。例如,如果John
Smoltz是一個(gè)Closer的話,把他的role替換為Starter;但是如果他不是一個(gè)Starter的話,則把role屬性修改為Closer;那么,你可以編寫如
下的代碼:
| 以下為引用的內(nèi)容: SET @doc.modify(' replace value of (/Team/Players/Pitcher[ @name="John Smoltz"]/@role)[1] with ( if (/Team/Players/Pitcher[ @name="John Smoltz"]/@role = "Closer") then "Starter" else "Closer" ) ') |
nodes方法
nodes方法用于把一組由一個(gè)查詢返回的結(jié)點(diǎn)轉(zhuǎn)換成一個(gè)類似于結(jié)果集的表中的一組記錄行。該方法的語法如下:
nodes (XQuery) Table(Column)
這里,XQuery是選擇要暴露為一個(gè)結(jié)果集的結(jié)點(diǎn)的表達(dá)式。Table和Column用于指定結(jié)果集中的名字。注意,你僅可以操作一列并且它的自
動(dòng)類型為XML。例如,為了查詢并得到每一個(gè)投球手的信息,你可以編寫如下的代碼:
| 以下為引用的內(nèi)容: DECLARE @doc XML SELECT @doc = ' <Team name="Braves"> <Players> <Pitcher name="John Smoltz" role="Closer"> With team since 1989 </Pitcher> </Players> </Team>' SELECT Team.player.query('.') as Pitcher FROM @doc.nodes('/Team/Players/Pitcher') Team(player) |
這些在單個(gè)結(jié)果集中的結(jié)果包含相應(yīng)于每一個(gè)投球手的元素的行數(shù)據(jù):
| 以下為引用的內(nèi)容: Pitcher -------------------------------------------- <Pitcher name="John Smoltz" role="Closer" /> <Pitcher name="Russ Ortiz" role="Starter" /> (2 row(s) affected) |
注意,上面你使用了query方法把這些結(jié)點(diǎn)返回到結(jié)果中。其原因在于,一個(gè)nodes方法的結(jié)果可能僅能為XML方法(查詢,修改,刪除和更
新)或IS NULL和IS NOT NULL語句所參考。
一般地,你可以使用nodes方法把XML分解為一組更為有用的結(jié)果。例如,你可以使用nodes方法得到運(yùn)動(dòng)員的結(jié)點(diǎn),然后使用value方法檢
索它們以便得到作為標(biāo)量數(shù)據(jù)的單個(gè)值:
| 以下為引用的內(nèi)容: SELECT Team.player.value( './@name', 'nvarchar(10)') as Name, Team.player.value('./@role', 'nvarchar(10)') as PlayerRole FROM @doc.nodes('/Team/Players/Pitcher') Team(player) |
這會(huì)產(chǎn)生如下的結(jié)果:
| 以下為引用的內(nèi)容: Name PlayerRole |
分享:高手是怎樣煉成的:精妙SQL語句介紹如何從一位菜鳥蛻變成為高手,靈活使用的SQL語句是必不可少的。本文收集了部分比較經(jīng)典,常用的SQL語句供大家參考,希望對(duì)大家有所幫助。 說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a 新表名:b)
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫(kù),提示 無法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 揭秘SQL Server2000安全設(shè)置全攻略
- 詳解SQL Server 2008安裝過程
- 淺談SQL Server數(shù)據(jù)倉(cāng)庫(kù)相關(guān)概念及構(gòu)建流程
- 解析SQL 2000和Sql 2005如何相互轉(zhuǎn)換
- 怎樣優(yōu)化SQLServer數(shù)據(jù)庫(kù)服務(wù)器內(nèi)存配置
- sqlsever為標(biāo)識(shí)列指定顯式值
- 揭秘規(guī)范設(shè)計(jì)數(shù)據(jù)庫(kù)應(yīng)注意的14個(gè)技巧
- 怎樣讓SQL Server加速運(yùn)行
- 怎樣從多個(gè)位置截取字符串的SQL語句
- 逐行掃描 為你講解幾個(gè)基本SQLPLUS命令
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索SQL Server2005的XML數(shù)據(jù)類型之基礎(chǔ)篇(2)
- 教程說明:
Mssql數(shù)據(jù)庫(kù)教程-SQL Server2005的XML數(shù)據(jù)類型之基礎(chǔ)篇(2)
。