执行存储在 table 列中的不同查询
Execute distinct queries stored in table column
我有一个 table the_tbl
,其中有一列 SQL Statement
,每行有不同的 SQL 查询。
******************************************************
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 查询已经执行,则不应重复。
例如,如果您查看 the_tbl 上的第 1 行和第 3 行,则会重复查询 SELECT * FROM the_tbl
。我怎样才能阻止这种情况发生?
我可以在 Cursor 中使用 If 语句吗?这样它就不会重复已经执行过的相同查询?
使用 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
这是一种非游标的方式
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)
我有一个 table the_tbl
,其中有一列 SQL Statement
,每行有不同的 SQL 查询。
******************************************************
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 查询已经执行,则不应重复。
例如,如果您查看 the_tbl 上的第 1 行和第 3 行,则会重复查询 SELECT * FROM the_tbl
。我怎样才能阻止这种情况发生?
我可以在 Cursor 中使用 If 语句吗?这样它就不会重复已经执行过的相同查询?
使用 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
这是一种非游标的方式
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)