根据其他节点的属性值删除节点



我在SQL中返回了以下XML,我想使用SQL XML DML根据不同节点的值有条件地删除节点。 在我的示例中,当"大小"节点的"值"属性的值等于"S"时,我想删除"颜色"节点。

<root>
<ParentGroup>
<ChildGroup Id="1">
<Child Id="1">
<Color Value="Red"/>
<Size Value="L"/>
</Child>
<Child Id="2">
<Color Value="Blue"/>
<Size Value="S"/>
</Child>
</ChildGroup>
<ChildGroup Id="2">
<Child Id="5">
<Color Value="Blue"/>
<Size Value="L"/>
</Child>
<Child Id="9">
<Color Value="Red"/>
<Size Value="S"/>
</Child>
</ChildGroup>
</ParentGroup>
</root>

我希望生成的 XML 是:

<root>
<ParentGroup>
<ChildGroup Id="1">
<Child Id="1">
<Color Value="Red"/>
<Size Value="L"/>
</Child>
<Child Id="2">
<Size Value="S"/>
</Child>
</ChildGroup>
<ChildGroup Id="2">
<Child Id="5">
<Color Value="Blue"/>
<Size Value="L"/>
</Child>
<Child Id="9">
<Size Value="S"/>
</Child>
</ChildGroup>
</ParentGroup>
</root>

提前感谢!

您可以使用predicate<Child>节点减少为列表,以满足您的条件:

DECLARE @xml XML=
N'<root>
<ParentGroup>
<ChildGroup Id="1">
<Child Id="1">
<Color Value="Red" />
<Size Value="L" />
</Child>
<Child Id="2">
<Color Value="Blue" />
<Size Value="S" />
</Child>
</ChildGroup>
<ChildGroup Id="2">
<Child Id="5">
<Color Value="Blue" />
<Size Value="L" />
</Child>
<Child Id="9">
<Color Value="Red" />
<Size Value="S" />
</Child>
</ChildGroup>
</ParentGroup>
</root>';

--查询将搜索<Size>内属性Value为"S"的<Child>,并删除其<Color>

SET @xml.modify('delete /root/ParentGroup/ChildGroup/Child[Size/@Value="S"]/Color');
SELECT @xml;

如果需要引入"S"作为变量,可以使用sql:variable()

DECLARE @SearchFor VARCHAR(10)='S';
SET @xml.modify('delete /root/ParentGroup/ChildGroup/Child[Size/@Value=sql:variable("@SearchFor")]/Color');

相关内容

  • 没有找到相关文章

最新更新