试用SQL Server 2008增强的XML DML功能

来源:互联网 发布:腾讯云 linux pptp 编辑:程序博客网 时间:2024/06/14 09:44

           XML DMLXML数据修改语言)是XQuery语言的扩展。根据W3C的定义,XQuery语言缺少数据操作(DML)部分。本节介绍SQL Server 2008中的XML DML,使用它们对可以对XML数据类型进行操作。XML DML将会使用区分大小写的关键字添加到XQuery中,包括:insertdeletereplace value of

1.插入insert

    使用针对XMLDML语句insert,可以向XML文档中插入属性或元素,而且还可以指定插入的位置。使用语法如下:

insert

      Expression1 (

                 {as first | as last} into | after | before

                                    Expression2

                )

    其中,Expression1用于标识要插入的一个或多个节点。into参数可将Expression1标识的节点作为Expression2标识的节点的直接后代(子节点)插入。如果Expression2中的节点已有一个或多个子节点,则必须使用as firstas last来指定所需的新节点添加位置。after参数作用是将Expression1标识的节点作为Expression2标识的节点的同级节点直接插入在其后面。before参数作用则与after相反,它会将Expression1标识的节点作为Expression2标识的节点的同级节点直接插入在其前面。Expression2参数是一个普通的标识节点。

    例如,首先声明一个XML类型的变量EmployeeInfo,再为其添加XML数据。

DECLARE @EmployeeInfo xml

SET @EmployeeInfo=

'<row>

  <员工编号>1018</员工编号>

  <员工姓名>祝红涛</员工姓名>

</row>

'

    现在向EmployeeInfoXML内容中添加一个新元素,新元素的内容为“<所任职位>员工</所任职位>”,位置为最底部。编写如下语句完成插入操作:

SET @EmployeeInfo.modify(

'insert <所任职位>员工</所任职位>

 as last

 into (/row)[1] '

)

    插入完成后,再通过如下语句来查看最终结果:

select @EmployeeInfo

    执行上述语句后最初变量EmployeeInfo里的XML文档被插入一个新元素“<所任职位>”,现在的结果如下所示:

<row>

  <员工编号>1018</员工编号>

  <员工姓名>祝红涛</员工姓名>

  <所任职位>员工</所任职位>

</row>

2delete

    delete语句可以删除XML实例中的元素,它的是语法很简单,如下所示:

delete Expression

    参数Expression用于标识要删除节点的XQuery表达式。执行时会删除该表达式选择的所有节点,以及所选节点中的所有节点或值,而且这个表达式不能是根"/"节点。

    例如,使用如下的语句可以将前面在EmployeeInfo变量插入的元素“<所任职位>”。

SET @EmployeeInfo.modify(

'delete /row/所任职位

')

3replace value of

    在前面简单介绍了使用XML DMLinsertdelete语句来插入和删除XML文档中的内容,最后来介绍一下如何使用replace value of子句对XML文档中的节点进行更新。如下所示是它的语法形式:

replace value of

      Expression1

with

      Expression2

    语法中,Expression1参数为要更新的节点,它必须仅标识一个单个节点,即必须是一个静态单独节点。如果XML已类型化,则节点的类型必须是简单类型,如果选择了多个节点则会出现错误。Expression2则是新节点的值,如果该值是值列表,则update语句将使用此列表替换旧值。

 

提示

在修改类型化的XML实例中,Expression2必须是Expression1的相同类型或子类型。否则将返回错误。

 

    例如,使用下面的语句可以将前面创建EmployeeInfo变量中的“所任职位”元素的值进行替换,执行后元素的将值从“员工”修改为“主管”。

SET @EmployeeInfo.modify(

'replace value of(/row/所任职位[1]/text())[1]

 with "主管"

')