我在SQL中返回了以下XML,我想使用SQL XML DML根据不同节点的值有条件地删除节点。在我的例子中,当“Size”节点的“Value”属性的值等于“S”时,我想删除“Color”节点。
<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>
提前致谢!
答案 0 :(得分:0)
您可以使用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>';
- 查询将搜索<Child>
,其中Value
中的属性<Size>
为&#34; S&#34;并删除他们的<Color>
SET @xml.modify('delete /root/ParentGroup/ChildGroup/Child[Size/@Value="S"]/Color');
SELECT @xml;
如果你需要介绍&#34; S&#34;作为变量,您可以使用sql:variable()
DECLARE @SearchFor VARCHAR(10)='S';
SET @xml.modify('delete /root/ParentGroup/ChildGroup/Child[Size/@Value=sql:variable("@SearchFor")]/Color');