Вы можете использовать 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>
равен "S", и удаляет их <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');