我在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>
现在,我想删除这个xml中的几个节点,过滤器是这样的(Id = 2 AND Name =’Alex’)或(Id = 3 AND Name =’Amy’),我不想使用Cursor或像这样的事情,仅使用一个脚本就可以做到,但是我无法获得答案,有人可以帮助我吗?提前致谢!!!
输出应为:
<Root> <Data> <Id>1</Id> <Name>Kevin</Name> <Des>Des1</Des> </Data> </Root>
PS:筛选器是#table,所以,实际的问题是,如何删除#table中包含的XML中的特定记录?
Id Name 2 Alex 3 Amy
Declare @Xml XML set @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>' create TABLE #tempResult ( Id Int, Name Varchar(10) ) insert into #tempResult values(2, 'Alex'), (3, 'Amy') SET @Xml = ( SELECT Node.value('Id[1]','int') AS PId, Node.value('Name[1]','Varchar(10)') AS PName FROM @Xml.nodes('//Data') AS T(Node) OUTER APPLY ( SELECT tr.Id, tr.Name FROM #tempResult tr WHERE Node.value('Id[1]','int') = tr.Id and Node.value('Name[1]','Varchar(10)') = tr.Name ) a WHERE a.Id IS NULL FOR XML PATH(''), TYPE ) select @Xml drop table #tempResult
我得到这样的结果1 Kevin
但是我需要整个xml包含Root节点:
我怎样才能做到这一点?有什么帮助吗?我是从SQL到XML的新学习者,请帮助我!!!
我得到了答案,谢谢大家
declare @xml xml set @xml = '<Root><Header>123</Header><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><Tail>456</Tail></Root>' --set @xml.modify('delete /Root/Data[(Id[.=1] and Name[.="Kevin"]) or (Id[.=2] and Name[.="Alex"])]') select @xml declare @parameter XML set @parameter = (SELECT Node.value('(Id)[1]', 'Int') AS Id, Node.value('(Name)[1]', 'Varchar(10)') AS Name FROM @xml.nodes('Root/Data') TempXML(Node) WHERE Node.value('(Id)[1]', 'Int') != 3 for xml path('Root'), TYPE) --select @parameter declare @sql nvarchar(max) set @sql = convert(nvarchar(max), @parameter.query('for $i in (/Root) return concat("(Id[.=", string($i/Id[1]), "] and Name[.=""", string($i/Name[1]), """]) or")') ) set @sql = '['+substring(@sql,0,len(@sql)-2)+']' set @sql = 'set @xml.modify(''delete /Root/Data'+@sql+''')' select @sql exec sp_executesql @sql, N'@xml xml output', @xml output select @xml