/*------------------------------------------------------------------------------+
#| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : |
#|{>/------------------------------------------------------------------------\<}|
#|: | Author : 小爱 |
#|: | Description: XML modify() 方法 |
#|: | SQL Version: 适用于 SQL 2005, SQL 2008 , SQL 2012 |
#|: | Copyright : 转载请注明出处。更多请访问:http://blog.csdn.net/beirut |
#|: | Create Date: 2012-11-22 |
#|: | About Me : 一个菜鸟dba |
#|{>\------------------------------------------------------------------------/<}|
#| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : |
#+-----------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------------------------------
本章讲述 modify() 方法 , modify() 方法是使用 XML DML 语句在 XML 数据中插入、更新或删除节点。
语法:modify (XML_DML) XML_DML 是 XML 数据操作语言 (DML) 中的字符串。
XML DML 将下列区分大小写的关键字添加到 XQuery 中:
insert --添加
delete --删除
replace value of --更新
------------------------------------------------------------------------------------------------------------------*/

DECLARE @x XML
SET @x='
<root>
<rogue id="001">
<hobo id="1">
<name>彪</name>
<type>流氓</type>
</hobo>
</rogue>
</root>'

------------------------------------------------------插入------------------------------------------------------------
--在 hobo 节点下插入 一个新节点
SET @x.modify('
insert <nickname>阿彪</nickname>
as first
into (/root/rogue/hobo)[1]
');
SELECT @x
--注释:如果某节点下面有多个节点的时候可以使用 as first 或 as last 来指定所需的新节点添加位置。

---在指定的 hobo 节点下,插入同一级节点
SET @x.modify('
insert <id>1</id>
before (/root/rogue/hobo)[1]
');
SELECT @x
--注释:是用 before 或者 after 关键字代替 into 在指定节点的 前面 或者 后面 插入同级节点
--after 关键字 和 before 关键字不能用于插入属性

--插入属性 一次插入多个属性值/使用变量/属性定位
DECLARE @a INT =5
SET @x.modify('
insert (
attribute a {sql:variable("@a")},
attribute b {".5"}

)
into (/root/rogue/hobo[@id=1])[1]
');
SELECT @x;
GO
----------------------------------------------------删除------------------------------------------------------------
DECLARE @x XML
SET @x='
<?Instructions for=TheWC.exe ?>
<root>
<rogue id="001">
<hobo id="1" weight="80" age="25">
<name>彪</name>
<type>流氓</type>
<nickname>阿彪</nickname>
<notes />
</hobo>
<page_hotspots />
</rogue>
<notes />
</root>'
-- 删除属性
SET @x.modify('
delete /root/rogue/hobo/@id
')
SELECT @x

-- 删除节点
SET @x.modify('
delete /root/rogue/hobo/name[1]
')
SELECT @x

-- 删除节点内容
SET @x.modify('
delete /root/rogue/hobo/type/text()
')
SELECT @x

-- 删除所有处理指令
SET @x.modify('
delete //processing-instruction()
')
SELECT @x

-- 删除所有的内容为空的节点
SET @x.modify('
delete //*[empty(./*)]
')

SELECT @x

----------------------------------------------------修改------------------------------------------------------------

DECLARE @x XML
SET @x='
<root>
<rogue id="001">
<hobo id="1" weight="80" age="25">
<name>彪</name>
<type>流氓</type>
<nickname>阿彪</nickname>
</hobo>
</rogue>
</root>'
-- 在修改语法当中 每次只能修改一个单个节点,不能批量修改或者一次修改多个值,这一点是比较郁闷的

-- 修改节点值
SET @x.modify('
replace value of (/root/rogue/hobo/name/text())[1]
with "光辉"
')
SELECT @x

-- 修改属性值
SET @x.modify('
replace value of (/root/rogue/hobo/@weight)[1]
with "70"
')
SELECT @x

-- 使用 if 表达式
SET @x.modify('
replace value of (/root/rogue/hobo/@age)[1]
with (
if (count(/root/rogue/hobo/*) > 2) then
"30"
else
"10"
)
')
SELECT @x

------------------------------------------------------一些示例------------------------------------------------------------

-- 1
DECLARE @x1 XML
SELECT @x1 = '
<rogue>
<hobo name="彪"/>
<hobo name="光辉"/>
<hobo name="小D"/>
<hobo name="野子"/>
</rogue>'

------------------------------------------------------------
-- 把 小D 移动到 彪 前面
------------------------------------------------------------
SET @x1.modify('
insert /rogue/hobo[@name="小D"]
before (/rogue/hobo[@name="彪"])[1]
')

SET @x1.modify ('
delete (/rogue/hobo[@name="小D"])[2]
')

SELECT @x1

---------- --------------------------------------------------
-- 把 光辉 移动到 野子 后面
------------------------------------------------------------
SET @x1.modify('
insert /rogue/hobo[@name="光辉"]
after (/rogue/hobo[@name="野子"])[1]
')

SET @x1.modify ('
delete (/rogue/hobo[@name="光辉"])[1]
')

SELECT @x1

------------------------------------------------------------
-- 把 野子 向前移动一级
------------------------------------------------------------
SET @x1.modify('
insert /rogue/hobo[@name="野子"]
before (/rogue/hobo[. << (/rogue/hobo[@name="野子"])[1]])[last()]
')

SET @x1.modify ('
delete /rogue/hobo[@name="野子"]
[. is (/rogue/hobo[@name="野子"])[last()]]
')

SELECT @x1
------------------------------------------------------------
-- 把 彪 向后 移一级
------------------------------------------------------------
set @x1.modify('
insert /rogue/hobo[@name="彪"]
before (/rogue/hobo[. >> (/rogue/hobo[@name="彪"])[1]])[2]
')
SELECT @x1
SET @x1.modify ('
delete (/rogue/hobo[@name="彪"])[1]
')

SELECT @x1

------------------------------------------------------------
-- 使用变量修改属性名称
------------------------------------------------------------
DECLARE @x2 XML
SELECT @x2 = '
<Employees>
<Employee FirstName="Jacob" MiddleName="V" LastName="Sebastian"/>
</Employees>'

DECLARE @var VARCHAR(20)
DECLARE @val VARCHAR(20)

SELECT @var = 'MiddleName'
SELECT @val = 'J'

SET @x2.modify('
replace value of (
/Employees/Employee/@*[local-name()=sql:variable("@var")]
)[1]
with sql:variable("@val")
')

select @x2

转载---SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除的更多相关文章

  1. sql server 数据库基础学习心得 思维导图

  2. SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除

    /*------------------------------------------------------------------------------+ #| = : = : = : = : ...

  3. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  4. Sql Server约束的学习二(检查约束、默认约束、禁用约束)

    接上一篇的Sql Server约束学习一(主键约束.外键约束.唯一约束) 4.检查约束 1)检查约束的定义 检查约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另一个列的值, ...

  5. mysql与sql server参照对比学习mysql

    mysql与sql server参照对比学习mysql 关键词:mysql语法.mysql基础 转自桦仔系列:http://www.cnblogs.com/lyhabc/p/3691555.html ...

  6. cmd常用命令 和 sql server相关基础

    在Java开发中 ms sql server 接触算是比较少的,本文记录一些ms sql server的基础知识. 1. 为表字段增加索引:create index user_openid on us ...

  7. Sql Server数据库基础

    --------------------------------------第一章  Sql Server数据库基础------------------------------------------ ...

  8. 第一篇——第一文 SQL Server 备份基础

    原文:第一篇--第一文 SQL Server 备份基础 当看这篇文章之前,请先给你的所有重要的库做一次完整数据库备份.下面正式开始备份还原的旅程. 原文出处: http://blog.csdn.net ...

  9. SQL Server— 存在检测、建库、 建表、约束、外键、级联删除

    /******************************************************************************** *主题: SQL Server- 存 ...

随机推荐

  1. ACCESS-字符函数

    mid:等于delphi中的COPY举例str="123456"mid(str,2,1)的意思是在str字符串中从第2个字符开始取得一个字符,结果为2注意:下标是从1开始,而不是从 ...

  2. 转载SSIS中的容器和数据流—数据转换(Transformations)续

    数据挖掘请求 数据挖掘任务是SSIS中一个很重要的任务,它的思想来源于一些算法.数据挖掘请求运行数据挖掘请求,并将结果输出到数据流.它还可以添加一些预测新列,一些应用场合如下列举: 根据已知的一些列, ...

  3. vs之Nuget

    1.http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 2.在Nuget控制台中安装特定版本: Install-Package <程序包 ...

  4. ZOJ1111:Poker Hands(模拟题)

    A poker deck contains 52 cards - each card has a suit which is one of clubs, diamonds, hearts, or sp ...

  5. ECSHOP在线手册布局参考图--文章列表页 article_cat.dwt

        A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...

  6. .NET世界各成员之间的关系

    相信看到这篇文章的人,心中肯定有这样的想法:ODBC.OLEDB.ADO.ADO.NET貌似都是访问数据库的东东,那么他们之间有什么区别,又有什么联系呢?不要着急,待我慢慢道来. 先说ODBC,官方的 ...

  7. 关于 mysql.test 数据库

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. 安装Intel HAXM为Android 模拟器加速,30秒内启动完成

    要求 必备知识 windows 7 基本操作. 运行环境 windows 7(64位); Android Studio 1.1.0;JDK 1.7.0_75(64位);android-sdk_r24 ...

  9. ios常用动画

    // // CoreAnimationEffect.h // CoreAnimationEffect // // Created by VincentXue on 13-1-19. // Copyri ...

  10. SVN 中trunk、branches、tags都什么意思?

    1.trunk是主分支,是日常开发进行的地方. 2.branches是分支.一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中.又比如为不同用户客制化的版 ...