Создание сценария al oop в SQL - PullRequest
1 голос
/ 14 января 2020

Меня попросили создать скрипт oop в SQL, который будет извлекать имя таблицы, имя столбца и операцию из списка, который я создам. Затем l oop через каждую строку в списке и создать запрос. Смотри ниже мое мышление.

  • Таблица 1, столбец х, сумма;
  • Таблица 2, столбец z, сумма;
  • Таблица 3, столбец F, сумма;
Loop
  Select  operation(ColumnName)    
  From TableName 
End Loop (When there is nothing left in the list)

Я иду по этому правильному пути или я где-то ошибаюсь? Или это вообще возможно?

Любая помощь, которую вы можете предложить, будет очень признательна

Ответы [ 3 ]

0 голосов
/ 14 января 2020
DECLARE @ToSquare INT
DECLARE @Square INT
SET @ToSquare = 0
WHILE @ToSquare < 100
BEGIN
    SET @ToSquare = @ToSquare + 1
    SET @Square = @ToSquare * @ToSquare
    IF @Square > 1000
        BREAK
    PRINT @Square
END
0 голосов
/ 14 января 2020

Я думаю, что вы можете использовать CURSOR. Примерно так:

DECLARE @your_Cursor CURSOR 
    SET @your_Cursor = CURSOR FAST_FORWARD
        FOR SELECT ColumnName FROM TableName 
    OPEN @your_Cursor 
    FETCH NEXT FROM @your_Cursor 
    INTO @value
    WHILE @@FETCH_STATUS = 0 BEGIN

        -- do something 
        END

    CLOSE @your_Cursor 
    DEALLOCATE @your_Cursor 
0 голосов
/ 14 января 2020

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