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
。
所以,是的,这是需要的。
我有一个存储过程使用动态 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
。
所以,是的,这是需要的。