我有一个存储过程,它使用动态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吗?
答案 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)