SQL 服务器 - 光标错误
SQL Server - Cursor Error
我正在声明一个动态游标,因为基于数据的父子关系嵌套了存储过程,这些数据可以在多个级别上处理并且每天都在变化。存储过程适用于父调用,但是此过程对子数据的处理会导致一条消息,指出 "Cursor is not open." 此消息发生在 Fetch 上,在检查以确保游标已打开后立即出现。
DECLARE @OutCur CURSOR;
DECLARE @curName as NVARCHAR(MAX);
...
SET @curName = LEFT(replace(replace(CONVERT (time, GETDATE()),':',''),'.',''),8);
SET @sqlCommand = 'SELECT a.myfields FROM mytable a;
SET @sqlCommand = 'SET @cursor' + @curName + ' = CURSOR LOCAL FAST_FORWARD FOR ' + @sqlCommand + ' OPEN @cursor' + @curName + ';'
SET @curName = '@cursor' + @curName + ' cursor output';
EXEC sys.sp_executesql @sqlCommand,@curName,@OutCur output
IF CURSOR_STATUS('global','@OutCur')=-1
OPEN @OutCur;
FETCH NEXT FROM @OutCur INTO @name,@type
提前感谢您的输入。
如果您取消注释 close+deallocate - 脚本工作正常:
GO
DECLARE @OutCur CURSOR;
DECLARE @curName as NVARCHAR(MAX), @sqlCommand nvarchar(max), @name varchar(100), @type varchar(100)
declare @i int = 0
while @i < 5
begin
SET @curName = LEFT(replace(replace(CONVERT (time, GETDATE()),':',''),'.',''),8);
SET @sqlCommand = 'SELECT ''111'' as name, ''cc'' as type; '
SET @sqlCommand = 'SET @cursor' + @curName + ' = CURSOR LOCAL FAST_FORWARD FOR ' + @sqlCommand + ' OPEN @cursor' + @curName + ';'
SET @curName = '@cursor' + @curName + ' cursor output';
EXEC sys.sp_executesql @sqlCommand,@curName,@OutCur output
FETCH NEXT FROM @OutCur INTO @name,@type
select @name, @type
--close @OutCur
--deallocate @OutCur
set @i += 1
end
GO
我正在声明一个动态游标,因为基于数据的父子关系嵌套了存储过程,这些数据可以在多个级别上处理并且每天都在变化。存储过程适用于父调用,但是此过程对子数据的处理会导致一条消息,指出 "Cursor is not open." 此消息发生在 Fetch 上,在检查以确保游标已打开后立即出现。
DECLARE @OutCur CURSOR;
DECLARE @curName as NVARCHAR(MAX);
...
SET @curName = LEFT(replace(replace(CONVERT (time, GETDATE()),':',''),'.',''),8);
SET @sqlCommand = 'SELECT a.myfields FROM mytable a;
SET @sqlCommand = 'SET @cursor' + @curName + ' = CURSOR LOCAL FAST_FORWARD FOR ' + @sqlCommand + ' OPEN @cursor' + @curName + ';'
SET @curName = '@cursor' + @curName + ' cursor output';
EXEC sys.sp_executesql @sqlCommand,@curName,@OutCur output
IF CURSOR_STATUS('global','@OutCur')=-1
OPEN @OutCur;
FETCH NEXT FROM @OutCur INTO @name,@type
提前感谢您的输入。
如果您取消注释 close+deallocate - 脚本工作正常:
GO
DECLARE @OutCur CURSOR;
DECLARE @curName as NVARCHAR(MAX), @sqlCommand nvarchar(max), @name varchar(100), @type varchar(100)
declare @i int = 0
while @i < 5
begin
SET @curName = LEFT(replace(replace(CONVERT (time, GETDATE()),':',''),'.',''),8);
SET @sqlCommand = 'SELECT ''111'' as name, ''cc'' as type; '
SET @sqlCommand = 'SET @cursor' + @curName + ' = CURSOR LOCAL FAST_FORWARD FOR ' + @sqlCommand + ' OPEN @cursor' + @curName + ';'
SET @curName = '@cursor' + @curName + ' cursor output';
EXEC sys.sp_executesql @sqlCommand,@curName,@OutCur output
FETCH NEXT FROM @OutCur INTO @name,@type
select @name, @type
--close @OutCur
--deallocate @OutCur
set @i += 1
end
GO