Выполнить отдельные запросы, хранящиеся в столбце таблицы - PullRequest
0 голосов
/ 11 июня 2018

У меня есть таблица the_tbl, в которой есть столбец SQL Statement, с различными запросами SQL в каждой строке.

the_tbl: table described here

******************************************************
Col1 ||  Col2  || SQL_Statement
******************************************************
A    |     1   |  SELECT * FROM the_tbl
B    |     2   |  SELECT Col 2 from the_tbl
C    |     3   |  SELECT * FROM the_tbl
****************************************************** 

Я использую курсор, чтобы перебирать каждую строку и печатать результаты каждого оператора.

DECLARE @execute_queries nvarchar(max)  

DECLARE my_cur CURSOR FOR 
SELECT the_tbl.SQL_Statement FROM the_tbl;

OPEN my_cur;
FETCH NEXT FROM my_cur INTO @execute_queries;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXECUTE(@execute_queries) 
    FETCH NEXT FROM my_cur INTO @execute_queries
END;
CLOSE my_cur

Я надеюсь выполнить курсор таким образом, чтобы, если SQL-запрос уже был выполнен, он не должен повторяться.

Например, если вы посмотрите на строки 1 и 3 the_tbl, запрос SELECT * FROM the_tbl повторяется.Как я могу предотвратить это?Могу ли я использовать оператор If внутри курсора?чтобы он не повторял тот же самый запрос, который уже был выполнен?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Это не курсорный способ сделать это

См. Рабочую демонстрацию

declare @execute_queries nvarchar(max) 
select @execute_queries=stuff((select distinct ';'
+ the_tbl.SQL_Statement FROM the_tbl 
for xml path('')),1,1,'')
execute( @execute_queries)
0 голосов
/ 11 июня 2018

Используйте оператор GROUP BY для удаления дубликатов:

SELECT the_tbl.SQL_Statement FROM the_tbl GROUP BY the_tbl.SQL_Statement;

Таким образом, ваш код должен быть:

DECLARE @execute_queries nvarchar(max)  

DECLARE my_cur CURSOR FOR 
SELECT the_tbl.SQL_Statement FROM the_tbl GROUP BY the_tbl.SQL_Statement; --Added GROUP BY

OPEN my_cur;
FETCH NEXT FROM my_cur INTO @execute_queries;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXECUTE(@execute_queries) 
    FETCH NEXT FROM my_cur INTO @execute_queries
END;
CLOSE my_cur
DEALLOCATE my_cur

Как указано в комментариях, вы можете достичь того же результата, используяDISTINCT:

DECLARE @execute_queries nvarchar(max)  

DECLARE my_cur CURSOR FOR 
SELECT DISTINCT the_tbl.SQL_Statement FROM the_tbl; --Added DISTINCT

OPEN my_cur;
FETCH NEXT FROM my_cur INTO @execute_queries;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXECUTE(@execute_queries) 
    FETCH NEXT FROM my_cur INTO @execute_queries
END;
CLOSE my_cur
DEALLOCATE my_cur
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...