У меня проблема с данными, некоторые значения хранятся в столбце XML в базе данных. Я воспроизвел проблему в следующем примере:
Сценарий установки:
create table XMLTest
(
[XML] xml
)
--A row with two duff entries
insert XMLTest values ('
<root>
<item>
<flag>false</flag>
<frac>0.5</frac>
</item>
<item>
<flag>false</flag>
<frac>0</frac>
</item>
<item>
<flag>false</flag>
<frac>0.5</frac>
</item>
<item>
<flag>true</flag>
<frac>0.5</frac>
</item>
</root>
')
В части XML неправильные записи с <flag>false</flag>
и <frac>0.5</frac>
, так как значение flag
должно быть true
для ненулевых frac
значений.
Следующий SQL-код идентифицирует узлы элементов XML, которые требуют обновления:
select
i.query('.')
from
XMLTest
cross apply xml.nodes('root/item[flag="false" and frac > 0]') x(i)
Я хочу сделать обновление для исправления этих узлов, но я не вижу, как изменить элементы item
, обозначенные cross apply
. Я видел, что обновление выглядит примерно так:
update t
set
x.i.modify('replace value of (flag/text())[1] with "true"')
from
XMLTest t
cross apply xml.nodes('root/item[flag="false" and frac > 0]') x(i)
Однако это не работает: я получаю сообщение об ошибке «Неверный синтаксис рядом с« изменить »».
Можно ли это сделать с помощью этого метода?
Я знаю, что альтернативой было бы сделать замену строки в столбце xml, но мне не нравится, что это немного неубедительно (и я не уверен, что это не сломало бы мои проблемы с реальными словами )