Вам уже говорили, что хранить XML в строковом типе - очень плохая идея. Всегда лучший выбор - использовать соответствующий тип в вашем дизайне данных.
Кроме того, если вам нужно придерживаться этого дизайна (иногда мы должны делать причудливые вещи), вы можете попробовать что-то подобное:
- Создание макета таблицы для имитации вашей проблемы:
DECLARE @tbl TABLE(CustomProperties VARCHAR(1000));
INSERT INTO @tbl VALUES
('<CustomProperties
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CustomProperty>
<Dev>....</Dev>
<Key>FieldA</Key>
<Value>....</Value>
</CustomProperty>
<CustomProperty>
<Dev>....</Dev>
<Key>FieldB</Key>
<Value>....</Value>
</CustomProperty>
<CustomProperty>
<Dev>....</Dev>
<Key>FieldC</Key>
<Value>....</Value>
</CustomProperty>
<CustomProperty>
<Dev>....</Dev>
<Key>FieldD</Key>
<Value>....</Value>
</CustomProperty>
</CustomProperties>');
- строка поиска
DECLARE @myVar varchar(50) = 'FieldA';
- запрос
UPDATE @tbl SET CustomProperties = CAST(CAST(CustomProperties AS XML)
.query('
<CustomProperties>
{/CustomProperties/CustomProperty[Key != sql:variable("@myVar")]}
</CustomProperties>
') AS VARCHAR(1000));
SELECT * FROM @tbl;
Идея вкратце:
Вместо XMLDML (через .modify()
) мы используем простой UPDATE ... SET ...
и присваиваем воссозданному XML. Метод XML .query()
вернет XML без значения <CustomProperty>
, соответствующего предикату.