我正在尝试使用游标来清理不再需要的临时表。我有一个小表,其中包含临时表的名称和标识符。游标陷入无限循环,但前提是我在其中执行某些语句。如果我只是打印出 中的值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
Run Code Online (Sandbox Code Playgroud)
如果我注释掉这些行
IF(OBJECT_ID(@table_name) IS NOT NULL)
EXEC('DROP TABLE ' + @table_name);
UPDATE SearchTables SET Deleted=1 WHERE ID=@id;
Run Code Online (Sandbox Code Playgroud)
PRINT
输出所有的 ID 和表名。如果我不评论它们,我得到的只是一遍又一遍的第一行,直到我取消查询。我也尝试将IF
线路更改为,EXEC('DROP TABLE IF EXISTS ' + @table_name)
但这也不起作用。
Dav*_*oft 12
当您Deleted=1
使用 FAST_FORWARD 游标设置并再次读取它时,您可能正在移动该行。改用 STATIC 游标,它将迭代数据的副本,并避免改变您正在遍历的数据结构。
DECLARE st CURSOR LOCAL STATIC FOR . . .
Run Code Online (Sandbox Code Playgroud)
你想要WHILE @@FETCH_STATUS = 0
这意味着继续,除非出现问题。
使用<> -1
方式将继续即使该行中读取缺失,或者它不执行读取操作,使其无限除非你得到-1
的返回值,因为有4个返回值的@@FETCH_STATUS
。
0 The FETCH statement was successful.
-1 The FETCH statement failed or the row was beyond the result set.
-2 The row fetched is missing.
-9 The cursor is not performing a fetch operation
Run Code Online (Sandbox Code Playgroud)
.
归档时间: |
|
查看次数: |
1524 次 |
最近记录: |