我遇到了一个数据问题,其中一些值存储在数据库的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列上进行字符串替换,但我不喜欢这样做有点不明显(我不相信它不会破坏我的真实单词问题)
答案 0 :(得分:3)
不可能一次更新多个地方的一个XML实例,因此您必须在循环中完成更新,直到完成为止。
From http://msdn.microsoft.com/en-us/library/ms190675.aspx“Expression1:标识要更新其值的节点。它必须只标识一个节点。”
-- While there are rows that needs to be updated
while exists(select *
from XMLTest
where [XML].exist('root/item[flag="false" and frac > 0]') = 1)
begin
-- Update the first occurence in each XML instance
update XMLTest set
[XML].modify('replace value of (root/item[flag="false" and frac > 0]/flag/text())[1] with "true"')
where xml.exist('root/item[flag="false" and frac > 0]') = 1
end