【发布时间】:2014-03-07 15:12:42
【问题描述】:
我在 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') OR (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 凯文
但我需要整个 xml 包含根节点:
<Root>
<Data>
<Id>1</Id>
<Name>Kevin</Name>
<Des>Des1</Des>
</Data>
</Root>
我怎样才能做到这一点?有什么帮助吗?我是 SQL 到 XML 的新手,请帮助我!!!
【问题讨论】:
-
这个重复链接只是删除表中的特定记录,我想删除一个XML参数中的记录,这个不一样...
-
完全没有区别。您只需要指向您的参数/变量而不是表格列,方法是相同的。
-
@JNK 建议的问题是关于使用另一个 XML 从 XML 中删除项目,这 与您的问题不同,但 one of the answers 确实包含对您有用的信息,提供在多种条件下删除多个节点的各种方法。您只需将列引用替换为变量的引用。
-
我只是使用下面的脚本在数据库中执行,
标签: sql sql-server xml xquery