1. CREATE TABLE Team ( TeamID int identity not null, TeamDoc xml DEFAULT '<Team />' NOT NULL )query方法 注意:你可以在表和視圖列、T-SQL語句或存儲過程的參數中使用XML。 這個方法允許你指定一個要計算的Xquery或XPath表達式,該方法的結果是一個XML數據類型對象。它的具體語法形式如下:
SELECT TeamDoc.value( '(/Team/Players/Pitcher/@name)[1]', 'nvarchar(max)') AS FirstPitcher FROM Team
在每一個小組的第一個投球手的標量值中的這個查詢結果返回值如下:
FirstPitcher ------------------------------ John Smoltz (1 row(s) affected)
注意,query和value方法之間的不同在于,query方法返回一個XML數據類型-它包含查詢的結果;而value方法返回一個帶有查詢結果的非XML數據類型。另外,value方法僅能返回單個值(或標量值)。如果你試圖創建一個使用value方法返回多于一個值的XQuery表達式,你將得到一個錯誤。modify方法 盡管XQuery標準并沒有提供一種更新XML的機制,但是SQL Server 2005提供了一種方法用于即時地修改一個XML對象的一部分。這意味著,你不必僅為了修改而檢索一個完整的XML文檔。為了即時修改一個文檔,你可以采用一種結合方式-Modify方法和SQL Server 2005的新的XML數據修改語言(XML DML)。 Modify方法的語法是:
UPDATE Team SET TeamDoc.modify(' insert <Pitcher name="Jaret Wright"/> as last into (/Team/Players)[1] ') WHERE TeamDoc.exist('/Team[@name="Braves"]') = 1
注意,在這個UPDATE語句中的SET子句并不遵循你過去編寫SQL時所使用的SET x = y 模式。該語法假定,你能夠提供一個完全新的值來代替舊值-這在XML情況下意味著要使用一個完全新的文檔來代替舊文檔。當使用XML類型時,Modify方法可以即時修改原始文檔。也就是說,對于SQL Server來說,不必要對每一次修改都試圖替換整個文檔。在本例中的SET語法反映了一種即時修改一個文檔的更為有效的方式。 共有三種XML DML語句:insert,update和delete。這三個語句分別用于插入,更新和刪除一個XML對象的部分。每一個方法的語法類似于SQL,但是也有一些明顯的差別。 下面是相應于insert語句的語法:
insert InsertExpression ( {{as first | as last} into | after | before} LocationExpression )
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" ')
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" ) ')
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)
注意,上面你使用了query方法把這些結點返回到結果中。其原因在于,一個nodes方法的結果可能僅能為XML方法(查詢,修改,刪除和更新)或IS NULL和IS NOT NULL語句所參考。 一般地,你可以使用nodes方法把XML分解為一組更為有用的結果。例如,你可以使用nodes方法得到運動員的結點,然后使用value方法檢索它們以便得到作為標量數據的單個值:
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)
這會產生如下的結果:
Name PlayerRole --------------- --------------- John Smoltz Closer Russ Ortiz Starter (2 row(s) affected)