exist方法
這個exist方法用於決定是否一個查詢能夠產生任何結果這個exist方法的語法形式如下
exist(XQuery)
當你使用這個exist方法時它計算這個XQuery查詢並且如果該查詢產生任何結果的話返回值例如下面語句查詢小組表行中是否TeamDoc域中存有Starter投手
下面是簡單的Exist語句
SELECT Count(*)
FROM Team
WHERE TeamDocexist(
/Team/Players/Pitcher[@role=Starter]) =
value方法
當你不想解釋整個查詢的結果而只想得到一個標量值時這個value方法是很有幫助的這個value方法用於查詢XML並且返回一個原子值這個value方法的語法如下
value(XQuerydatatype)
借助於value方法你可以從XML中得到單個標量值為此你必須指定XQuery語句和你想要它返回的數據類型並且你可以返回除了XML數據類型外的任何數據類型例如如果你想得到每一個小組中的第一個投球手的名字你可以編寫如下形式的查詢語句
進行一次查詢以得到單個值
SELECT TeamDocvalue(
(/Team/Players/Pitcher/@name)[]
nvarchar(max))
AS FirstPitcher
FROM Team
在每一個小組的第一個投球手的標量值中的這個查詢結果返回值如下
FirstPitcher
John Smoltz
( row(s) affected)
注意query和value方法之間的不同在於query方法返回一個XML數據類型它包含查詢的結果而value方法返回一個帶有查詢結果的非XML數據類型另外value方法僅能返回單個值(或標量值)如果你試圖創建一個使用value方法返回多於一個值的XQuery表達式你將得到一個錯誤
modify方法
盡管XQuery標准並沒有提供一種更新XML的機制但是SQL Server 提供了一種方法用於即時地修改一個XML對象的一部分這意味著你不必僅為了修改而檢索一個完整的XML文檔為了即時修改一個文檔你可以采用一種結合方式Modify方法和SQL Server 的新的XML數據修改語言(XML DML)
Modify方法的語法是
modify(<XMLDML>)
該方法僅使用一個參數XML DML語句XML DML也類似於SQL的insertupdate和delete語法但是並不一樣例如你可以通過使用insert DML語句來修改XML
SET @docmodify(
insert <Pitcher name=Jaret Wright/> as last
into (/Team/Players)[]
)
另外你還可以通過調用一個UPDATE語句並修改一個XML列來實現同樣目的
修改一個XML文檔而不完全替換它
UPDATE Team
SET TeamDocmodify(
insert <Pitcher name=Jaret Wright/> as last
into (/Team/Players)[]
)
WHERE TeamDocexist(/Team[@name=Braves]) =
注意在這個UPDATE語句中的SET子句並不遵循你過去編寫SQL時所使用的SET x = y 模式該語法假定你能夠提供一個完全新的值來代替舊值這在XML情況下意味著要使用一個完全新的文檔來代替舊文檔當使用XML類型時Modify方法可以即時修改原始文檔也就是說對於SQL Server來說不必要對每一次修改都試圖替換整個文檔在本例中的SET語法反映了一種即時修改一個文檔的更為有效的方式
共有三種XML DML語句insertupdate和delete這三個語句分別用於插入更新和刪除一個XML對象的部分每一個方法的語法類似於SQL但是也有一些明顯的差別
下面是相應於insert語句的語法
insert
InsertExpression (
{{as first | as last}
into | after | before} LocationExpression
)
緊跟著這個insert語句的是你想要插入的XML(InsertExpression)接下來你需要指定你想怎樣插入該XML你的選擇是intoafter或before其中before和after子句指令數據庫把InsertExpression作為LocationExpression的一個兄弟(sibling)插入before或after則指定是在LocationExpression的前面還是後面插入它
SET @docmodify(
insert <Pitcher role=Starter
name=Jaret Wright/>
before (/Team/Players/Pitcher)[]
)
這個into子句把InsertExpression作為LocationExpression的一個孩子結點插入可選子句as first和as last用於指定在該孩子結點中插入的位置
在小組內進行插入
SET @docmodify(
insert <Pitcher role=Starter
name=Jaret Wright/>
into (/Team/Players)[]
)
在小組內進行插入指定它應該
作為最後一個元素插入
SET @docmodify(
insert <Pitcher role=Starter
name=Jaret Wright/>
as last into (/Team/Players)[]
)
delete語句的語法很直接
delete LocationExpression
這個LocationExpression指定要從XML數據中刪除什麼內容例如要刪除所有的投球手:
SET @docmodify(delete/Team/Player/Pitcher)
因為查詢指定所有的投球手元素所以它們將被全部刪除如果你想僅刪除一個元素那麼你可以指定標識屬性例如為了僅刪除投球手John Smoltz你可以編寫如下的delete語句
SET @docmodify(
delete /Team/Players/Pitcher[@name=John Smoltz]
)
你可以使delete語句刪除單個屬性例如為了刪除針對投球手John Smoltz的role屬性相應的XML DML看上去如下所示
SET @docmodify(
delete /Team/Players/Pitcher[
@name=John Smoltz]/@role)
最後replace value語句描述了對XML數據的修改這個replace value語句的語法如下
replace value of
OriginalExpression
with
ReplacementValue | if
這個replace value語句用來修改在XML中的值唯一可能的值是一個標簽的內容或一個屬性的值這個OriginalExpression必須解析為單個結點或屬性這個ReplacementValue通常是一個要代替的值代替一個結點的內容要求使用text()函數的XQuery表達式來指定你想代替一個結點的文本例如為了替換一個投球手的內部文本(inner text)你可以編寫類似如下的Modify語句
DECLARE @doc xml
SELECT @doc =
<Team name=Braves>
<Players>
<Pitcher name=John Smoltz role=Closer>
With team since
</Pitcher>
</Players>
</Team>
SET @docmodify(
replace value of (/Team/Players/Pitcher[
@name=John Smoltz]/text())[]
with May start in
)
修改屬性是直接的你只需要使用XQuery表達式來解析單個屬性例如為了使用Starter替換投球手John Smoltz的role屬性的值你可以編寫如下的語句
SET @docmodify(
replace value of (/Team/Players/Pitcher[
@name=John Smoltz]/@role)[]
with Starter
)
replace value語法也支持條件替換這可以通過在replace value語句的with子句內使用if…then…else語法實現例如如果John Smoltz是一個Closer的話把他的role替換為Starter但是如果他不是一個Starter的話則把role屬性修改為Closer那麼你可以編寫如下的代碼
SET @docmodify(
replace value of (/Team/Players/Pitcher[
@name=John Smoltz]/@role)[]
with (
if (/Team/Players/Pitcher[
@name=John Smoltz]/@role = Closer) then
Starter
else
Closer
)
)
[] [] [] []
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22486.html