SQL Server XML基础学习之<6>--XML modify() 方法对 XML 数据中插入、更新或删除
2012-11-23 18:00
901 查看
/*------------------------------------------------------------------------------+
#| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : |
#|{>/------------------------------------------------------------------------\<}|
#|: | 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
#| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : |
#|{>/------------------------------------------------------------------------\<}|
#|: | 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 数据中插入、更新或删除
- SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除
- SQL Server XML基础学习之<6>--XQuery的 value() 方法、 exist() 方法 和 nodes() 方法
- SQL Server XML基础学习之<6>--XQuery的 value() 方法、 exist() 方法 和 nodes() 方法
- MySQL 学习<七> 插入、更新与删除数据
- Android sqlite 数据库查询,插入,删除,更新demo<第3章>---测试验证插入数据
- SQL Server XML基础学习之<4>--XPath
- MSSQL 中使用modify()方法,此方法使用XML DML语句在XML 数据中插入,更新或删除节点
- c++ 实现顺序表类(初始化、输入、插入与删除)<<计算机软件技术基础 徐士良>>
- Android sqlite 数据库查询,插入,删除,更新demo<第2章>
- Android sqlite 数据库查询,插入,删除,更新demo<第4章>---查询
- 【SQL Server】学习笔记2—插入数据、删除数据、更新数据
- <java><JTable>使用AbstractTableModel实现更新、删除、插入数据
- SQL Server 触发器中 Update的方法 判断一列是否更新 <转>
- Android sqlite 数据库查询,插入,删除,更新demo<第1章>
- Android sqlite 数据库查询,插入,删除,更新demo<第5章>---删除
- Android sqlite 数据库查询,插入,删除,更新demo<第3章>---插入
- SQL Server XML基础学习之<5>--XQuery(query)
- Android sqlite 数据库查询,插入,删除,更新demo<第6章>---更新
- hibernate3.3.2学习笔记---三种对象状态&删除数据&获取数据库对象&更新数据库对象