如果我有这样的表格,最好的解决方案是什么:
Value Formular
12 'SELECT Value+5 AS result'
15 'SELECT 4/Value+3 AS result'
16 'SELECT 5 AS result'
因此,Formular-Column中有SQL-Statemants(作为nvarchar(max))。现在我需要为每行计算结果。
当前的方法是带光标的WHILE并为自己处理每一行。
我们需要为每一行使用一个临时表,因为我们无法找到更好的解决方案,如何从exec中获取结果。像:
declare @Value decimal(18,4);
create table #t(val decimal(18,4))
insert into #t exec(@formular)
select val from #t
我们有> 100'000个这样的行,这需要约2小时的计算。 (当然,公式和数值比给定的例子更复杂)
是否有可能得到像
这样的东西SELECT Value, exec(Formular) as result FROM calctable
由于
好的,我发现至少有一个针对EXEC()和temptable的解决方法:
declare @formular as nvarchar(max)
declare @r_value decimal(18,4);
set @formular='....'
set @formular='select @r_value = Value FROM (' + @formular + ')dt'
EXEC sp_executesql @formular, N'@r_value DECIMAL(18,4) OUTPUT', @r_value OUTPUT
UPDATE Result_Values SET [Value]=@r_value WHERE ID=@calc_id;
答案 0 :(得分:2)
可以执行此示例:
像你的calctable一样创建一个表,你可以省略这个部分。
create table calctable(value int)
insert calctable values(1)
insert calctable values(3)
填充临时表,您可以用自己的表替换它。
declare @t table(value int, Formular varchar(50))
insert @t values(12,'Value+5 AS result' )
insert @t values(15,'4/Value+3 AS result')
insert @t values(16,'5 AS result')
这是您需要的语法:
declare @sql varchar(max)
select @sql = coalesce(@sql +' union all ', '') + 'select ' + cast(value as varchar(16)) +' value,'+formular+' from calctable' from @t
exec (@sql)
结果:
value result
12 6
12 8
15 7
15 4
16 5
16 5