Jon*_*ton 3 xml sql sql-server sql-server-2008 xquery-sql
我遇到了存储在数据库 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>
')
Run Code Online (Sandbox Code Playgroud)
在 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)
Run Code Online (Sandbox Code Playgroud)
我想要进行更新以更正这些节点,但我不知道如何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)
Run Code Online (Sandbox Code Playgroud)
但这不起作用:我收到错误“‘修改’附近的语法不正确”。
通过这个方法可以实现吗?
我知道另一种方法是在 xml 列上进行字符串替换,但我不喜欢这样做,因为它有点不微妙(而且我不相信它不会破坏我的实际问题)
一次无法在多个位置更新一个 XML 实例,因此您必须循环执行更新,直到完成为止。
来自http://msdn.microsoft.com/en-us/library/ms190675.aspx “表达式1:标识其值要更新的节点。它必须仅标识单个节点。”
-- 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
Run Code Online (Sandbox Code Playgroud)