SQL游标执行quandry

时间:2015-12-18 15:58:37

标签: sql sql-server cursor dynamic-sql

我有一个存储过程,它使用动态sql为报表构建其复杂查询。有一次,它在打开游标之前正在调用exec(@sql) ...我认为这是一个错误,exec(@sql)命令可以被删除,因为它是单独执行而不需要使用游标。 ..

我是对的吗?这是一个片段:

-- before this it's just doing string concatenation
SET @sql = N'DECLARE cc CURSOR STATIC FOR ' + @sql 
exec(@Sql) --<-- is this needed here?
OPEN cc

不打开光标有效地运行光标内的SQL吗?

2 个答案:

答案 0 :(得分:1)

是的,这是必要的。

@sql变量前面带有CURSOR声明脚本,位于EXEC(@sql)行之前。它是以这种方式完成的,因为您无法使用以下内容声明游标:

DECLARE cc CURSOR STATIC FOR EXECUTE(@sql)

您无法宣布CURSOR FOR执行。

这是以这种方式编写的,通过将CURSOR declare语句添加到动态SQL来解决这个问题。原作者并没有尝试在CURSOR的主体内执行它,而是为编写的动态SQL的结果集创建CURSOR

所以,是的,这是必要的。

答案 1 :(得分:0)

即使我建议不要使用游标或动态sql,除非绝对必要,否则你需要在@sql变量中包含所有的游标操作(以及在同一数据集上运行的任何其他sql)。否则,您正在运行两个完全独立的sql命令。

例如:

SET @sql = N'DECLARE cc CURSOR STATIC FOR ' + @sql 
@sql = @sql + 'OPEN cc'
exec(@sql)