数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL Server2005的XML数据类型之基础篇[3]


发布日期:2024年07月11日
 
SQL Server2005的XML数据类型之基础篇[3]

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

)

)

[] [] [] []

               

上一篇:SQL Server2005的XML数据类型之基础篇[1]

下一篇:SQL Server2005的XML数据类型之基础篇[2]