SQL 游标执行难题

SQL Cursor execution quandry

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

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

例如:

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

是的,需要它。

@sql 变量在 EXEC(@sql) 行之前添加了 CURSOR 声明脚本。这样做是因为您不能使用以下内容声明游标:

DECLARE cc CURSOR STATIC FOR EXECUTE(@sql)

你不能声明一个 CURSOR FOR 一个 exec。

这是通过在动态 SQL 前面加上 CURSOR 声明语句来解决这个问题的。原作者并没有试图在一个CURSOR的体内执行它,而是为写的动态SQL的结果集创建一个CURSOR

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