重复更新表中的列

时间:2013-07-25 07:04:49

标签: sql sql-server sql-update

我有一张这样的表

CREATE TABLE #tmp(ColSelect NVARCHAR(400),ColParValues XML)

ColSelect 包含SQL Select语句, ColParValues 包含ColSelect中参数值的一些xml数据 例如ColSelectcontains:

 "SELECT [$12]+19/[$16]-[$54]"

和col 2包含引用ColSelect参数的名称值对

如何更新我的表,用ColParValues中的相关值替换每个参数。我用这句话:

update #tmp
SET
ColSelect=REPLACE(ColSelect,c.value('@Value','nvarchar(10)'),c.value('@Res','DECIMAL(24,12)'))
FROM #tmp t1
    CROSS APPLY t1.ColParValues.nodes('/root/r') AS n(c) 

但是此语句仅替换每行中的一个参数值。 这是样本数据link

1 个答案:

答案 0 :(得分:0)

这是一个解决方案:

create table #tmp (colselect varchar(200),colparvalues xml)

insert into #tmp (colselect,colparvalues)
values ('select case when [$71]+[$29]+10<25 then 1 else 0 end'
        ,'<root><r Value="[$71]" Res="1"/><r Value="[$29]" Res="5"/></root>'),
('select case when [$95]*[$29]+10<25 then 1 else 0 end'
        ,'<root><r Value="[$95]" Res="3"/><r Value="[$29]" Res="5"/></root>')

WHILE @@ROWCOUNT >0 
update #tmp
SET
ColSelect=REPLACE(ColSelect,c.value('@Value','nvarchar(10)'),c.value('@Res','DECIMAL(24,12)'))
FROM #tmp t1
    CROSS APPLY t1.ColParValues.nodes('/root/r') AS n(c)
WHERE t1.colselect LIKE'%'+replace(c.value('@Value','nvarchar(10)'),'[','')+'%'


select * from #tmp

drop table #tmp

然而,非常类似于游标的性能。检查性能。使用,如果确定。