我有一个 SQL 游标,使用它循环遍历表中的记录。
我正在尝试进行一些错误处理,其中执行应该停止,并且光标关闭/解除分配。
根据我的测试,如果我选择1/0;或者如果我 RAISEERROR (级别 16),则错误发生后继续执行,然后从游标中获取下一个重新编码,依此类推..
但是,如果我将上面的内容放在 TRY/CATCH 中并将
throw;
放在 CATCH 中,那么它就存在,这是正确的方法吗?我是否在 catch 块中关闭/取消分配游标?
您不需要关闭并释放游标变量,因为这会自动发生:
DECLARE @c cursor, @db int;
SET @c = cursor FORWARD_ONLY STATIC READ_ONLY FOR
SELECT database_id FROM sys.databases;
OPEN @c;
FETCH NEXT FROM @c INTO @db;
WHILE @@FETCH_STATUS <> -1
BEGIN
SELECT @db / 0;
FETCH NEXT FROM @c INTO @db;
END
有关详细信息,请参阅 Itzik Ben-Gan 的“被忽视的 T-SQL Gems”中的 游标变量部分。