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.
Puoi usare la funzione CURSOR_STATUS per determinare il suo stato.
IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
DEALLOCATE myCursor
END
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
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).
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!