it-swarm.com.de

Endlosschleife in CURSOR

Ich versuche, temporäre Tabellen mit einem Cursor zu bereinigen, wenn sie nicht mehr benötigt werden. Ich habe eine kleine Tabelle, die die Namen der temporären Tabellen zusammen mit einer Kennung enthält. Der Cursor steckt in einer Endlosschleife, aber nur, wenn ich bestimmte Anweisungen darin ausführe. Wenn ich nur die Werte aus FETCH ausdrucke, funktioniert es perfekt. Hier ist der Code.

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 [email protected];

    PRINT CAST(@id AS varchar(max)) + ' ' + @table_name;

    FETCH NEXT FROM st INTO @id, @table_name;
END 

CLOSE st
DEALLOCATE st

Wenn ich diese Zeilen auskommentiere

    IF(OBJECT_ID(@table_name) IS NOT NULL) 
        EXEC('DROP TABLE ' + @table_name);

    UPDATE SearchTables SET Deleted=1 WHERE [email protected];

PRINT gibt alle IDs und Tabellennamen aus. Wenn ich sie nicht kommentiere, erhalte ich nur die erste Zeile immer wieder, bis ich die Abfrage abbreche. Ich habe auch versucht, die Zeile IF in EXEC('DROP TABLE IF EXISTS ' + @table_name) zu ändern, aber das hat auch nicht funktioniert.

6
CB_Ron

Wahrscheinlich verschieben Sie die Zeile, wenn Sie Deleted=1 und lesen Sie es erneut mit Ihrem FAST_FORWARD-Cursor. Verwenden Sie stattdessen einen STATIC-Cursor, der eine Kopie der Daten iteriert, und vermeiden Sie eine Mutation der Datenstruktur, die Sie durchlaufen.

DECLARE st CURSOR LOCAL STATIC FOR . . .

Sie möchten WHILE @@FETCH_STATUS = 0, Was bedeutet, dass Sie fortfahren, es sei denn, etwas stimmt nicht.

Die Verwendung von <> -1 Bedeutet, dass der Vorgang auch dann fortgesetzt wird, wenn die abgerufene Zeile fehlte oder keine Abrufoperation ausgeführt wird. Dies macht ihn unendlich, es sei denn, Sie erhalten -1 Als Rückgabewert, da 4 Rückgabewerte für @@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

.

9
scsimon