我描述一下问题,我现在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)
*/