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

/*------------------------------------------------------------------------------+ 
#| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = :  | 
#|{>/------------------------------------------------------------------------\<}| 
#|: | 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

  

posted @ 2015-12-24 17:05  凡的世界  阅读(607)  评论(0编辑  收藏  举报