知识大全 SQL Server2005的XML数据类型之基础篇[3]

Posted 语句

篇首语:莫问天涯路几重,轻衫侧帽且从容。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SQL Server2005的XML数据类型之基础篇[3]相关的知识,希望对你有一定的参考价值。

SQL Server2005的XML数据类型之基础篇[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  exist方法  这个exist方法用于决定是否一个查询能够产生任何结果 这个exist方法的语法形式如下 exist(XQuery)  当你使用这个exist方法时 它计算这个XQuery查询 并且如果该查询产生任何结果的话返回值 例如 下面语句查询小组表行中是否TeamDoc域中存有Starter投手    下面是简单的Exist语句 SELECT Count(*) FROM TeamWHERE TeamDoc exist( /Team/Players/Pitcher[@role= Starter ] ) =   value方法  当你不想解释整个查询的结果而只想得到一个标量值时 这个value方法是很有帮助的 这个value方法用于查询XML并且返回一个原子值 这个value方法的语法如下 value(XQuery datatype)  借助于value方法 你可以从XML中得到单个标量值 为此 你必须指定XQuery语句和你想要它返回的数据类型 并且你可以返回除了XML数据类型外的任何数据类型 例如 如果你想得到每一个小组中的第一个投球手的名字 你可以编写如下形式的查询语句    进行一次查询以得到单个值 SELECT TeamDoc value( (/Team/Players/Pitcher/@name)[ ] nvarchar(max) ) AS FirstPitcherFROM 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的insert update和delete语法 但是并不一样 例如 你可以通过使用insert DML语句来修改XML SET @doc modify( insert <Pitcher name= Jaret Wright /> as lastinto (/Team/Players)[ ] )  另外 你还可以通过调用一个UPDATE语句并修改一个XML列来实现同样目的    修改一个XML文档而不完全替换它 UPDATE TeamSET TeamDoc modify( insert <Pitcher name= Jaret Wright /> as lastinto (/Team/Players)[ ] )WHERE TeamDoc exist( /Team[@name= Braves ] ) =   注意 在这个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的前面还是后面插入它 SET @doc modify( insert <Pitcher role= Starter name= Jaret Wright /> before (/Team/Players/Pitcher)[ ] )  这个into子句把InsertExpression作为LocationExpression的一个孩子结点插入 可选子句as first和as last用于指定在该孩子结点中插入的位置    在小组内进行插入 SET @doc modify( insert <Pitcher role= Starter name= Jaret Wright /> into (/Team/Players)[ ] )   在小组内进行插入 指定它应该   作为最后一个元素插入 SET @doc modify( insert <Pitcher role= Starter name= Jaret Wright /> as last into (/Team/Players)[ ] )  delete语句的语法很直接 delete LocationExpression  这个LocationExpression指定要从XML数据中删除什么内容 例如 要删除所有的投球手: SET @doc modify( delete/Team/Player/Pitcher )  因为查询指定所有的投球手元素 所以它们将被全部删除 如果你想仅删除一个元素 那么你可以指定标识属性 例如 为了仅删除投球手John Smoltz 你可以编写如下的delete语句 SET @doc modify( delete /Team/Players/Pitcher[@name= John Smoltz ] )  你可以使delete语句删除单个属性 例如 为了删除针对投球手John Smoltz的role属性 相应的XML DML看上去如下所示 SET @doc modify( 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 xmlSELECT @doc = <Team name= Braves ><Players><Pitcher name= John Smoltz role= Closer >With team since </Pitcher></Players></Team> SET @doc modify( replace value of (/Team/Players/Pitcher[@name= John Smoltz ]/text())[ ]with May start in )  修改属性是直接的 你只需要使用XQuery表达式来解析单个属性 例如 为了使用 Starter 替换投球手John Smoltz的role属性的值 你可以编写如下的语句 SET @doc modify( 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 @doc modify( replace value of (/Team/Players/Pitcher[@name= John Smoltz ]/@role)[ ]with (if (/Team/Players/Pitcher[@name= John Smoltz ]/@role = Closer ) then Starter else Closer ) )

cha138/Article/program/SQLServer/201311/22486

相关参考

知识大全 SQL Server2005的XML数据类型之基础篇[1]

SQLServer2005的XML数据类型之基础篇[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 使SQL Server数据支持 XML

使SQLServer数据支持XML  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  学习如何用SQ

知识大全 SQL Server 2005和SQL Server 2000数据的相互导入

SQLServer2005和SQLServer2000数据的相互导入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 SQL Server 2005 数据转换服务

SQLServer2005数据转换服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介  由

知识大全 在SQL Server 2005数据库中更改数据架构

在SQLServer2005数据库中更改数据架构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 SQL Server 2005数据转换服务常见设计问题

SQLServer2005数据转换服务常见设计问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Microsoft SQL Server 2005数据库镜像语句

MicrosoftSQLServer2005数据库镜像语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 SQL Server 2005数据库中的Output子句

SQLServer2005数据库中的Output子句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 SQL Server 2005 安全性(图)

SQLServer2005安全性(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据安全是