当前位置: 代码迷 >> Sql Server >> Sql剔除xml的多个node
  详细解决方案

Sql剔除xml的多个node

热度:86   发布时间:2016-04-24 18:28:43.0
Sql删除xml的多个node
我描述一下问题,我现在sql存储过程里面有一个XML类型的参数,现在我想删除这个参数里面的几个节点,举例如下:
XML
<Root>
  <Data>
    <Id>1</Id>
    <Name>Kevin</Name>
    <Des>Des1</Des>
  </Data>
  <Data>
    <Id>2</Id>
    <Name>Alex</Name>
    <Des>Des2</Des>
  </Data>
  <Data>
    <Id>3</Id>
    <Name>Amy</Name>
    <Des>Des3</Des>
  </Data>
</Root>

现在我想删除:(Id = 2 AND Name = 'Alex') OR (Id = 3 AND Name = 'Amy') 的这2条记录,输出结果XML为:
<Root>
  <Data>
    <Id>1</Id>
    <Name>Kevin</Name>
    <Des>Des1</Des>
  </Data>
</Root>

请问该如何写这个Sql操作XMl的脚本? 谢谢!
------解决方案--------------------
貌似不能一次性删除多个相同级别的节点,要循环删除,删除操作可以看:http://www.microsoft.com/china/msdn/library/data/sqlserver/XMLDML.mspx?mfr=true
------解决方案--------------------

declare @x xml

select @x='
<Root>
  <Data>
    <Id>1</Id>
    <Name>Kevin</Name>
    <Des>Des1</Des>
  </Data>
  <Data>
    <Id>2</Id>
    <Name>Alex</Name>
    <Des>Des2</Des>
  </Data>
  <Data>
    <Id>3</Id>
    <Name>Amy</Name>
    <Des>Des3</Des>
  </Data>
</Root>'

set @x.modify('delete /Root/*[3]')
set @x.modify('delete /Root/*[2]')

select @x 'newxml'

/*
newxml
------------------------------
<Root>
  <Data>
    <Id>1</Id>
    <Name>Kevin</Name>
    <Des>Des1</Des>
  </Data>
</Root>

(1 row(s) affected)
*/

------解决方案--------------------
方法2,

declare @x xml

select @x='
<Root>
  <Data>
    <Id>1</Id>
    <Name>Kevin</Name>
    <Des>Des1</Des>
  </Data>
  <Data>
    <Id>2</Id>
    <Name>Alex</Name>
    <Des>Des2</Des>
  </Data>
  <Data>
    <Id>3</Id>
    <Name>Amy</Name>
    <Des>Des3</Des>
  </Data>
</Root>'

-- 转为临时表
if object_id('tempdb..#t') is not null
 drop table #t

select o.value('Id[1]','int') 'Id',
       o.value('Name[1]','varchar(10)') 'Name',
       o.value('Des[1]','varchar(10)') 'Des'
into #t
from (select @x 'x') t
cross apply x.nodes('/Root/Data') x(o)

-- 按条件删除
delete from #t
 where (Id=2 and Name='Alex') or (Id=3 and Name='Amy')

-- 结果保存回@x
select @x=
(select * from #t for xml raw('Data'),root('Root'),elements)

-- 显示结果
select @x 'newxml'

/*
newxml
-----------------------------
<Root>
  <Data>
    <Id>1</Id>
    <Name>Kevin</Name>
    <Des>Des1</Des>
  </Data>
</Root>

(1 row(s) affected)
*/
  相关解决方案