«EXEC (имя столбца)» для каждой строки в SELECT и получить возвращаемое значение - PullRequest
1 голос
/ 12 сентября 2011

Что было бы лучшим решением, если бы у меня была такая таблица:

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 с курсором и обрабатывать каждую строку для себя.

Нам нужно использовать временную таблицу для каждой строки, потому чтомы не смогли найти лучшего решения, как получить результат от исполнителя.Например:

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 () и соблазнительный:

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 Ответ

2 голосов
/ 12 сентября 2011

Этот пример может быть выполнен:

Создавая таблицу, подобную вашей вычисляемой, вы можете опустить эту часть.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...