1. 程式人生 > >SQL Server XML基礎學習之--XML modify() 方法對 XML 資料中插入、更新或刪除

SQL Server XML基礎學習之--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