Tsql &引用;执行官(列名)";对于SELECT中的每一行,获取返回值

Tsql &引用;执行官(列名)";对于SELECT中的每一行,获取返回值,tsql,sql-server-2008,Tsql,Sql Server 2008,如果我有这样一张表,那么最好的解决方案是什么: Value Formular 12 'SELECT Value+5 AS result' 15 'SELECT 4/Value+3 AS result' 16 'SELECT 5 AS result' 因此,在公式列中有SQL语句(作为nvarchar(max))。现在我需要计算每一行的结果 当前的方法是使用游标并自行处理每一行 我们需要为每一行使用一个临时表,因为我们无法找到更好的解决方案,即如何从exec获得

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

Value   Formular
12      'SELECT Value+5 AS result'
15      'SELECT 4/Value+3 AS result'
16      'SELECT 5 AS result'
因此,在公式列中有SQL语句(作为nvarchar(max))。现在我需要计算每一行的结果

当前的方法是使用游标并自行处理每一行

我们需要为每一行使用一个临时表,因为我们无法找到更好的解决方案,即如何从exec获得结果。比如:

declare @Value decimal(18,4);
create table #t(val decimal(18,4))
insert into #t exec(@formular)
select val from #t
我们有超过10万行这样的行,这需要大约2小时来计算。(当然complexer的公式和值比给出的示例中的公式和值更复杂)

有没有可能得到这样的东西

SELECT Value, exec(Formular) as result FROM calctable
谢谢

编辑: 好吧,到目前为止,我至少为EXEC()找到了一个解决方案,而且很诱人:

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;

可以执行以下示例:

创建类似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

将整个表构建为一个SELECT字符串是一个有趣的想法,但是我担心我们的表有>100000行,这可能会导致一个非常大的sql字符串,并且解析/编译可能会非常昂贵。但我们会测试它