2010-08-19 4 views
3

Je me trouve dans une situation où une procédure stockée SQL Server appelle une autre et tous deux utilisent des curseurs qui ont le même nom. Cela provoque un conflit car, apparemment, les curseurs n'ont pas de visibilité restreinte à la procédure stockée où ils sont déclarés.Sql Server procédure stockée nom de curseur conflit

Est-il possible de rendre les curseurs privés à la procédure dans laquelle ils ont été déclarés?

+1

Pourquoi ne pouvez-vous pas modifier le nom du curseur dans l'un des SP? –

+0

Les curseurs sont des constructions très puissantes et il y a beaucoup de choses que l'on peut faire en SQL en utilisant des curseurs. oui, elles sont plus lentes que les opérations définies, mais elles extraient toutes vos données de la base de données, les traitent et les repoussent, ce que de nombreuses personnes feraient avec plaisir pour éviter d'utiliser un curseur lorsque le curseur fonctionne correctement. –

Répondre

7

Utilisez l'option LOCAL lorsque declaring the cursor.

LOCAL

Indique que la portée du curseur est local au lot, procédure stockée , ou le déclencheur dans lequel le curseur a été créé. Le nom du curseur est uniquement valide dans cette étendue. Le curseur peut être référencé par les variables de curseur locales dans le lot, la procédure stockée ou le déclencheur ou un paramètre de sortie OUTPUT enregistré. Une sortie paramètre est utilisé pour transmettre le curseur local vers le lot d'appel, procédure stockée ou un déclencheur, ce qui peut affecter le paramètre à une variable curseur pour référencer le curseur après la procédure stockée se termine. Le curseur est implicitement désalloué lorsque le lot, la procédure stockée ou le déclencheur se termine, sauf si le curseur a été renvoyé dans un paramètre OUTPUT . Si elle est renvoyée dans un paramètre OUTPUT , le curseur est désalloué lorsque la dernière variable référencée est désallouée ou passe à hors de portée.

2

-ce que les curseurs local curseurs ou global curseurs? ... Faites-les local ou tout simplement changer le nom d'un des curseurs et faire avec elle

3

Oui, vous pouvez limiter la portée d'un curseur la procédure stockée avec

DECLARE LOCAL cURSEUR

0

à moins que vous spécifiquement besoin un curseur global, utilisez un curseur local.

Si la déclaration de votre curseur n'inclut pas le mot clé LOCAL ou GLOBAL, SQL Server utilisera sa configuration de serveur par défaut. Vous pouvez déterminer la configuration par défaut en utilisant cette requête:

SELECT is_local_cursor_default FROM sys.databases WHERE name = DB_NAME(); 
0

Par défaut, si le commutateur LOCAL/GLOBAL n'est pas rempli lors de la déclaration du curseur, il sera réglé sur LOCAL implicitement. Je suggère cependant que LOCAL soit défini pour la clarté d'autres personnes en lisant votre code.

S'il vous plaît se référer à la note de l'article suivant:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql

Si vous écrivez deux curseurs dans la même portée (même procédure stockée), nommez simplement des noms différents.

Questions connexes