データベースの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)
ただし、これは機能していません。「'modify'の近くの構文が正しくありません」というエラーが表示されます。
これはこの方法で行うことができますか?
代わりに、xml列で文字列の置換を行うこともできますが、それが少し微妙ではないのは好きではありません(実際の文章題で問題が発生しないとは確信していません)。