На самом деле вам не нужно al oop, вы можете использовать простой оператор выбора для генерации запросов, например:
Демонстрация на DB Fiddle
create table query_parts(table_name varchar(100), col_name varchar(100), agg_func varchar(100));
insert into query_parts
select 'Table1', 'Column X', 'Sum';
insert into query_parts
select 'Table2', 'Column Y', 'Avg';
select 'select ' + agg_func + '(' + quotename(col_name) + ') from ' + quotename(table_name) + ';' as query
from query_parts
ОБНОВЛЕНИЕ
Если вы также хотите выполнить запросы, вы можете использовать следующий пример, чтобы начать:
Демонстрация на DB Fiddle
create table query_parts(id int identity, table_name varchar(100), col_name varchar(100), agg_func varchar(100), result decimal(12,6));
insert into query_parts (table_name, col_name, agg_func)
select 'Table1', 'Column_X', 'Sum';
insert into query_parts (table_name, col_name, agg_func)
select 'Table1', 'Column_Y', 'Avg';
create table Table1 (Column_X int, Column_Y decimal(12,6))
insert into Table1
select 5, 5;
insert into Table1
select 10, 10;
L oop через таблицу query_parts
и выполнение запросов:
declare @i int;
declare @query nvarchar(1000);
select @i = min(id)
from query_parts;
while (@i is not null)
begin
select @query = ('update query_parts set result = ('
+ ('select ' + agg_func + '(' + quotename(col_name) + ') from ' + quotename(table_name))
+ ') where id = ' + cast(@i as nvarchar))
from query_parts
where id = @i;
exec sp_executesql @query;
select @i = min(id)
from query_parts
where id > @i;
end