Est-il possible d'utiliser des paramètres dans un curseur SQL Server?
J'ai une relation parent-enfant dans la base de données. Ce que je dois faire est de faire une boucle par le parent de la requête, et à l'aide de la mère de la clé primaire, obtenu d'obtenir ses enfants. La question que je vais avoir, c'est que j'ai besoin d'utiliser un paramétrée curseur (passer à la clé) pour ce faire.
Est-il une telle chose dans SQL Server ou une astuce pour imiter? J'ai essayé de faire cela, mais il ne fonctionne pas:
DECLARE @value VARCHAR(20);
DECLARE @someKey NUMERIC(19,0);
DECLARE main_curs
CURSOR FOR SELECT value FROM someTable where key = @someKey;
SET @someKey = 12345;
OPEN main_curs
FETCH NEXT FROM main_curs INTO @value;
CLOSE main_curs
DEALLOCATE main_curs
Mais il semble qu'il ne ramasse pas de moi réglage de l' @someKey.
Toute aide serait grandement appréciée. Merci!
Mise à JOUR
Je devrait inclure davantage d'informations que j'ai fait l'exemple sembler trop simple. J'ai plusieurs @someKey valeurs que j'ai besoin d'utiliser. Comme mentionné avant, j'ai une relation parent-enfant et je peux avoir jusqu'à 6 enfants. Je suis donc d'obtenir une liste de parents et de deux colonnes et d'une itération à travers elle. Alors que dans le TOUT en BOUCLE, j'ai voulu obtenir la clé primaire de la mère et de l'appeler d'un autre curseur pour obtenir les renseignements sur l'enfant (différentes colonnes retournées). Donc, je voudrais faire plusieurs appels à l'enfant curseur avec les différents @someKey ensemble de valeurs. L'espoir qui fait sens.
OriginalL'auteur Ascalonian | 2011-06-06
Vous devez vous connecter pour publier un commentaire.
Une chose que vous pourriez faire est d'essayer en utilisant curseurs imbriqués. Un exemple de ceci est sur le bas de la page intitulée: à l'Aide de curseurs imbriqués à la production d'un rapport.
OriginalL'auteur John Kane
Ce que vous avez besoin est de 2 curseurs - un pour les parents et une pour les enfants .Assurez-vous que l'enfant curseur est DÉCLARÉ à l'intérieur de la BOUCLE et non à l'extérieur.il ne fonctionnera pas si vous déclarez à l'extérieur.
par exemple :
Les informations dans le lien à l'Aide de Microsoft de la documentation sur les curseurs imbriqués posté par John Kane, votre réponse est un peu inexact. S'il est vrai que la fermeture de l'enfant curseur ne change pas le contenu, la désallocation de l'enfant curseur forces SQL pour re-créer le curseur (et donc de modifier le contenu) sur la prochaine itération de la boucle. Si Karl est trompeuse, car bien que ce post est trompeuse. Vous pouvez obtenir de l'enfant intérieur curseur pour effectuer comme prévu par la désallocation dans la boucle, et pas seulement de le fermer. Donc cet exemple précis.
OriginalL'auteur Ajith Kannan
Voici comment vous pouvez déclarer un curseur avec le SQL dynamique, à l'aide de la "EXEC ()" la fonction. Surprise, c'est le travail. Par exemple:
OriginalL'auteur nwsmith
vous devez définir
@someKey = 12345;
avant la Déclaration de Curseur tels que:OriginalL'auteur Akhil
Vous semblez avoir de l'ordre des choses de mal, et vous n'êtes pas réellement en train de faire quelque chose à l'intérieur de la souris?
OriginalL'auteur Fosco
Si vous souhaitez effectuer une itération sur une hiérarchie récursive utilisation d'expressions de table communes, voir Requêtes Récursives À L'Aide D'Expressions De Table Communes. Vous pouvez déclarer votre curseur sur l'expression de table commune récursive, par exemple:
Mais le plus souvent les expressions cte peut éliminer complètement la nécessité d'un curseur.
OriginalL'auteur Remus Rusanu
Dans un autre endroit, quelqu'un a suggéré d'utiliser une procédure stockée (compilé SQL plutôt que de façon ad-hoc script) mais cela ne fonctionne pas non plus. Voici un autre MWE, qui montre le problème de manière assez claire:
Il semble que la variable (et sa valeur à l'époque) est lié à la "déclarer ... curseur" plutôt que le curseur ouvert.
OriginalL'auteur Rob at TVSeries.com