我有以下问题。我有一个存储在SQL数据库中的xml文件。 我应该通过除以100来更改所有VALUE标记值。 这是一个提取xml的结构:
<HEIGHTC>
<VALUE>15 </VALUE>
<HEIGHTC_DATE>201110180000</HEIGHTC_DATE>
</HEIGHTC>
<HEIGHTC>
<VALUE>15 </VALUE>
<HEIGHTC_DATE>201110250000 </HEIGHTC_DATE>
</HEIGHTC>
<HEIGHTC>
<VALUE>15 </VALUE>
<HEIGHTC_DATE>201111020000 </HEIGHTC_DATE>
</HEIGHTC>
<HEIGHTC>
<VALUE>15 </VALUE>
<HEIGHTC_DATE>201111080000 </HEIGHTC_DATE>
</HEIGHTC>
<HEIGHTC>
<VALUE>20 </VALUE>
<HEIGHTC_DATE>201111150000 </HEIGHTC_DATE>
</HEIGHTC>
<HEIGHTC>
<VALUE>15 </VALUE>
<HEIGHTC_DATE>201111290000 </HEIGHTC_DATE>
</HEIGHTC>
我找到了以下查询:
DECLARE @var varchar(50)
set @var='HEIGHTC'
UPDATE tcdc.dbo.BADM_Xml
SET xml_badm.modify('replace value of (/ROOT/*[local-name()=sql:variable("@var")]/VALUE/text())[1] with (/ROOT/*[local-name()=sql:variable("@var")]/VALUE)[1] * 0.01')
并且它一次适用于单个节点:有没有办法在单个指令中推广和更新所有节点? 提前 迭
答案 0 :(得分:13)
replace value of
一次只能更新一个节点。
查找要更新的所有XML中使用的最大节点数,并使用update语句中的循环变量一次修改一个节点。
where子句检查是否存在要修改的节点。如果没有它,您将修改表中每一次迭代的每一行。
declare @I int
select @I = max(xml_badm.value('count(/ROOT/HEIGHTC/VALUE)', 'int'))
from YourTable
while @I > 0
begin
update YourTable
set xml_badm.modify
('replace value of ((/ROOT/HEIGHTC/VALUE)[sql:variable("@I")]/text())[1]
with ((/ROOT/HEIGHTC/VALUE)[sql:variable("@I")]/text())[1] * 0.01')
where xml_badm.exist('(/ROOT/HEIGHTC/VALUE)[sql:variable("@I")]') = 1
set @I = @I - 1
end