Wie überprüfe ich, ob ein Cursor geöffnet ist oder nicht? Weil ich oft den Fehler "Cursor ist bereits vorhanden" vorfindet. Bitte lassen Sie mich wissen, wie ich überprüfen kann, ob ein Cursor bereits geöffnet ist.
Tatsächlich habe ich es am Ende sowohl geschlossen als auch freigegeben (CLOSE ppm_cursor; DEALLOCATE ppm_cursor;). Trotzdem bekomme ich den gleichen Fehler, was der Grund sein könnte.
Sie können die Funktion CURSOR_STATUS verwenden, um ihren Status zu ermitteln.
IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
DEALLOCATE myCursor
END
Schließen Sie den Cursor, wenn er leer ist, und heben Sie ihn auf:
IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
BEGIN
CLOSE myCursor
END
DEALLOCATE myCursor
END
Nur eine kleine Änderung an dem, was Gary W erwähnt hat, und 'SELECT' hinzufügen:
IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
DEALLOCATE myCursor
END
http://social.msdn.Microsoft.com/Forums/de/sqlgetstarted/thread/eb268010-75fd-4c04-9fe8-0bc33ccf9357
Dies geschah bei mir, als eine in SSMS ausgeführte gespeicherte Prozedur während der Schleife auf einen Fehler stieß, während der Cursor zum Durchlaufen von Datensätzen verwendet wurde und bevor er geschlossen wurde. Um das Problem zu beheben, fügte ich dem CATCH-Block zusätzlichen Code hinzu, um den Cursor zu schließen, falls er noch geöffnet ist (wobei CURSOR_STATUS als andere Antwort hier vorgeschlagen wird).
Ich beschäftige selten Cursor, aber ich habe gerade einen anderen Gegenstand entdeckt, der Sie hier beißen kann, den Umfang des Cursornamens.
Wenn die Datenbank CURSOR_DEFAULT global ist, erhalten Sie den Fehler "Cursor ist bereits vorhanden", wenn Sie in einer gespeicherten Prozedur einen Cursor mit einem bestimmten Namen (z. B. "cur") deklarieren. Während dieser Cursor geöffnet ist, rufen Sie eine andere gespeicherte Prozedur auf, die deklariert und öffnet einen Cursor mit demselben Namen (zB "cur"). Der Fehler tritt in der geschachtelten gespeicherten Prozedur auf, wenn versucht wird, "cur" zu öffnen.
Führen Sie diese SQL-Datei aus, um CURSOR_DEFAULT anzuzeigen:
select is_local_cursor_default from sys.databases where name = '[your database name]'
Wenn dieser Wert "0" ist, spielt es eine Rolle, wie Sie Ihren verschachtelten Cursor benennen!