web-dev-qa-db-ger.com

So prüfen Sie, ob der Cursor existiert (Status "Öffnen")

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.

31
Maddy

Sie können die Funktion CURSOR_STATUS verwenden, um ihren Status zu ermitteln.

IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
 DEALLOCATE myCursor
END
76
Gary W

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
30
Prateek

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).

0
Aaron

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!

0
Tom Regan