SQL Server XML基礎學習之--XML modify() 方法對 XML 資料中插入、更新或刪除
阿新 • • 發佈:2019-01-25
/*------------------------------------------------------------------------------+ #| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : | #|{>/------------------------------------------------------------------------\<}| #|: | 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