exist方法
这个exist方法用于决定是否一个查询能够产生任何结果。这个exist方法的语法形式如下:
当你使用这个exist方法时,它计算这个XQuery查询,并且如果该查询产生任何结果的话返回值1。例如,下面语句查询小组表行中是否TeamDoc域中存有Starter投手:
--下面是简单的Exist语句:
SELECT Count(*) FROM Team WHERE TeamDoc.exist( '/Team/Players/Pitcher[@role="Starter"]') = 1 |
value方法
当你不想解释整个查询的结果而只想得到一个标量值时,这个value方法是很有帮助的。这个value方法用于查询XML并且返回一个原子值。这个value方法的语法如下:
借助于value方法,你可以从XML中得到单个标量值。为此,你必须指定XQuery语句和你想要它返回的数据类型,并且你可以返回除了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方法的语法是:
该方法仅使用一个参数:XML DML语句。XML DML也类似于SQL的insert,update和delete语法,但是并不一样。例如,你可以通过使用insert DML语句来修改XML:
SET @doc.modify(' insert <Pitcher name="Jaret Wright"/> as last into (/Team/Players)[1] ') |
另外,你还可以通过调用一个UPDATE语句并修改一个XML列来实现同样目的:
--修改一个XML文档而不完全替换它:
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 ) |
紧跟着这个insert语句的是你想要插入的XML(InsertExpression)。接下来,你需要指定你想怎样插入该XML。你的选择是into,after或before。其中,before和after子句指令数据库把InsertExpression作为LocationExpression的一个兄弟(sibling)插入。before或after则指定是在LocationExpression的前面还是后面插入它: