“EXEC(列名)”为SELECT中的每一行,并获取返回值

时间:2011-09-12 08:05:44

标签: tsql sql-server-2008

如果我有这样的表格,最好的解决方案是什么:

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;

1 个答案:

答案 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