我在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');