我正在尝试在不再需要临时表时使用游标来清理它们。我有一个小表,其中包含临时表的名称和标识符。光标卡在无限循环中,但前提是我在其中执行某些语句。如果我只是从 中打印出值FETCH
,它就可以完美地工作。这是代码。
DECLARE @id bigint;
DECLARE @table_name varchar(max);
DECLARE st CURSOR LOCAL FAST_FORWARD FOR
SELECT ID, TableName FROM SearchTables WHERE CustomerID IS NULL
OPEN st
FETCH NEXT FROM st INTO @id, @table_name
WHILE @@FETCH_STATUS <> -1
BEGIN
IF(OBJECT_ID(@table_name) IS NOT NULL)
EXEC('DROP TABLE ' + @table_name);
UPDATE SearchTables SET Deleted=1 WHERE ID=@id;
PRINT CAST(@id AS varchar(max)) + ' ' + @table_name;
FETCH NEXT FROM st INTO @id, @table_name;
END
CLOSE st
DEALLOCATE st
如果我注释掉这些行
IF(OBJECT_ID(@table_name) IS NOT NULL)
EXEC('DROP TABLE ' + @table_name);
UPDATE SearchTables SET Deleted=1 WHERE ID=@id;
PRINT
输出所有的 ID 和表名。如果我不评论它们,我得到的只是第一行一遍又一遍,直到我取消查询。我也尝试将IF
线路更改为,EXEC('DROP TABLE IF EXISTS ' + @table_name)
但这也不起作用。
当您设置
Deleted=1
并使用 FAST_FORWARD 游标再次读取它时,您可能正在移动该行。改用 STATIC 游标,它将迭代数据的副本,并避免改变您正在遍历的数据结构。你想要
WHILE @@FETCH_STATUS = 0
这意味着继续,除非有什么不对劲。using
<> -1
意味着即使提取的行丢失,它也会继续,或者它没有执行提取操作,使其无限,除非你得到-1
作为返回值,因为有4 个返回值@@FETCH_STATUS
。.