如何使用 for 循环使用 XQuery 删除 xml 节点

How to using for loop using XQuery to delete xml nodes(如何使用 for 循环使用 XQuery 删除 xml 节点)
本文介绍了如何使用 for 循环使用 XQuery 删除 xml 节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 SQL 存储过程中有一个 XML 参数 @Xml,如下所示:

I have an XML parameter @Xml in SQL Stored procedure like below:

    <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 或类似的东西,只需使用一个脚本来完成它,我正在尽我所能,但我无法得到答案,有人可以帮助我吗?提前致谢!!!

now, I want to delete several nodes in this xml, the filter is like this (Id = 2 AND Name = 'Alex') OR (Id = 3 AND Name = 'Amy'), I don't want to use Cursor or something like this, just using one single script to do it, I am try to my best for this, but I can't get the answer, anybody can help me ? Thanks in advance!!!

输出应该是:

    <Root>
   <Data>
     <Id>1</Id>
     <Name>Kevin</Name>
     <Des>Des1</Des>
   </Data>
 </Root>

PS:过滤器是一个#table,那么,实际的问题是,如何删除包含在#table中的XML中的特定记录?

PS: the filter is a #table, so, the actually question is , how to remove the specific records in XML which contains in #table?

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凯文

I got results like this 1 Kevin

但我需要整个xml包含根节点:

But I need the the whole xml contains Root node:

    <Root>
  <Data>
    <Id>1</Id>
    <Name>Kevin</Name>
    <Des>Des1</Des>
  </Data>
</Root>

我怎样才能达到这个目标?有什么帮助吗?我是 SQL 到 XML 的新手,请帮助我!!!

How can I reach this? Any help? I am an new leaner for SQL to XML, please help me !!!

推荐答案

我得到了答案,谢谢大家

I got the answer, thanks all you guys

    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

这篇关于如何使用 for 循环使用 XQuery 删除 xml 节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
Hibernate reactive No Vert.x context active in aws rds(AWS RDS中的休眠反应性非Vert.x上下文处于活动状态)
Bulk insert with mysql2 and NodeJs throws 500(使用mysql2和NodeJS的大容量插入抛出500)
Flask + PyMySQL giving error no attribute #39;settimeout#39;(FlASK+PyMySQL给出错误,没有属性#39;setTimeout#39;)
auto_increment column for a group of rows?(一组行的AUTO_INCREMENT列?)
Sort by ID DESC(按ID代码排序)