1

我在 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>

提前致谢!

4

1 回答 1

1

您可以使用 apredicate<Child>-nodes 减少到一个列表,这可以满足您的条件:

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>属性为“S”的位置并删除其Value<Size><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');
于 2018-05-08T07:24:47.633 回答