risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come verificare se il cursore esiste (stato aperto)

Come posso controllare se un cursore è aperto o no? Perché molte volte trovo l'errore "Il cursore esiste già". Per favore fatemi sapere come posso verificare se un cursore è già in stato aperto.

Infatti ho chiuso e deallocato alla fine (CLOSE ppm_cursor; DEALLOCATE ppm_cursor;) Ma sto ancora ricevendo lo stesso errore quale potrebbe essere il motivo.

31
Maddy

Puoi usare la funzione CURSOR_STATUS per determinare il suo stato.

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

Chiudere il cursore, se è vuoto, quindi rilasciarlo:

IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
 BEGIN
  IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
   BEGIN
    CLOSE myCursor
   END
 DEALLOCATE myCursor
END
30
Prateek

Semplicemente piccola modifica a ciò che ha detto Gary W, aggiungendo "SELECT":

IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
 DEALLOCATE myCursor
END

http://social.msdn.Microsoft.com/Forums/en/sqlgetstarted/thread/eb268010-75fd-4c04-9fe8-0bc33ccf9357

Questo è successo a me quando una stored procedure in esecuzione in SSMS ha rilevato un errore durante il ciclo, mentre il cursore era in uso per scorrere i record e prima che fosse chiuso. Per risolvere il problema ho aggiunto del codice aggiuntivo nel blocco CATCH per chiudere il cursore se è ancora aperto (utilizzando CURSOR_STATUS come suggerito da altre risposte).

0
Aaron

Uso raramente dei cursori, ma ho appena scoperto un altro elemento che può morderti qui, l'ambito del nome del cursore. 

Se il database CURSOR_DEFAULT è globale, si otterrà l'errore "il cursore esiste già" se si dichiara un cursore in una stored procedure con un nome particolare (ad esempio "cur") e mentre quel cursore è aperto si chiama un'altra stored procedure che dichiara e apre un cursore con lo stesso nome (es. "cur"). L'errore si verificherà nella stored procedure nidificata quando tenta di aprire "cur".

Esegui questo bit di SQL per visualizzare il tuo CURSOR_DEFAULT:

select is_local_cursor_default from sys.databases where name = '[your database name]'

Se questo valore è "0", allora il nome del cursore annidato è importante!

0
Tom Regan