web-dev-qa-db-fra.com

Comment vérifier si le curseur existe (statut ouvert)

Comment vérifier si un curseur est ouvert ou non? Parce que je rencontre souvent l'erreur «Le curseur existe déjà». S'il vous plaît laissez-moi savoir comment puis-je vérifier si un curseur est déjà en statut ouvert.

En fait, je l'ai fermé et je l'ai désalloué à la fin (CLOSE ppm_cursor; DEALLOCATE ppm_cursor;) mais je reçois toujours la même erreur, quelle qu'en soit la raison.

31
Maddy

Vous pouvez utiliser la fonction CURSOR_STATUS pour déterminer son état.

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

Fermez le curseur, s'il est vide, désallouez-le:

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

Juste un petit changement à ce que Gary W a mentionné, en ajoutant '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

Cela m'est arrivé lorsqu'une procédure stockée exécutée dans SSMS a rencontré une erreur pendant la boucle, alors que le curseur était utilisé pour parcourir les enregistrements et avant sa fermeture. Pour résoudre ce problème, j'ai ajouté du code supplémentaire dans le bloc CATCH pour fermer le curseur s'il était toujours ouvert (en utilisant CURSOR_STATUS comme le suggèrent d'autres réponses ici).

0
Aaron

J'utilise rarement des curseurs, mais je viens de découvrir un autre élément qui peut vous mordre ici, la portée du nom du curseur. 

Si la base de données CURSOR_DEFAULT est globale, vous obtiendrez l'erreur "le curseur existe déjà" si vous déclarez un curseur dans une procédure stockée avec un nom particulier (par exemple, "cur"), et lorsque ce curseur est ouvert, appelez une autre procédure stockée qui déclare et ouvre un curseur avec le même nom (par exemple "cur"). L'erreur se produira dans la procédure stockée imbriquée lorsqu'elle tentera d'ouvrir "cur".

Exécutez ce bit de SQL pour voir votre CURSOR_DEFAULT:

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

Si cette valeur est "0", le nom de votre curseur imbriqué est important!

0
Tom Regan