1

我有一张这样的桌子

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) 

但是此语句仅替换每一行中的一个参数值。这是示例数据链接

4

1 回答 1

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

但是,在性能上与游标非常相似。检查性能。没问题就用。

于 2013-07-25T09:10:36.263 回答