2010-07-16 7 views
1

J'ai une situation où je veux avoir un proc stocké retournant une table qui s'appelle récursivement dans le cadre de son calcul.récursivité stockée proc dans SQL Server

Malheureusement, SQL Server n'a rien de tout cela et me donne une erreur à la fois de ne pas pouvoir déclarer un curseur qui existe déjà et de ne pas pouvoir imbriquer et insérer une instruction exec. Pourrais-je contourner certains de ces problèmes en utilisant une fonction?

Y a-t-il une autre meilleure façon de faire cela?

Le calcul est intrinsèquement récursif, donc il n'y a pas moyen de contourner ce problème en utilisant des jointures autant que je sache.

EDIT: pour clarifier le calcul réel puisque le code est compliqué par d'autres choses et pourrait compliquer la table On suppose que Cervin

A a des colonnes (containerId, objID, objType, poids) et le tableau B comporte des colonnes (itemID , valeur).

objType dans le tableau A vous indique si objID dans le tableau A est un containerId (encore une fois dans le tableau A) ou est et itemID du tableau B.

(containerId, objID) est une clé primaire sur le tableau A est itemID sur la table B.

En général, un conteneur contient des dizaines à des centaines d'articles ou d'autres conteneurs. Espérons que la profondeur de la récurrence ne dépasse pas une douzaine de niveaux. (deviner) Le calcul consiste à obtenir une moyenne pondérée.

+1

Je voudrais en savoir plus sur le calcul ... les fonctions joueront sans aucun doute un rôle, mais vous seriez surpris de certaines des choses insensées que vous pouvez faire avec les sous-requêtes et les vues. J'aime les curseurs, mais ils sont souvent calomniés ... – Fosco

+1

Pourriez-vous fournir un peu plus d'informations - en particulier en ce qui concerne la nature du sproc récursif. –

+2

Est-ce SQL Server? Si vous utilisez SQL 2008, vous pouvez utiliser un CTE récursif pour accomplir la plupart des tâches sans avoir besoin d'un curseur du tout. Que diriez-vous d'un échantillon de code pour que nous puissions voir ce que vous essayez de faire? – JohnFx

Répondre

3

vous fournir très peu d'informations, à la suite est ici une supposition: essayez d'utiliser Recursive Queries Using Common Table Expressions, essayez les opérations basées sur des ensembles et non un curseur, ou essayez d'utiliser SQL dynamique.

0

Je pense que vous obtenez une erreur car le même nom de curseur est probablement utilisé par chaque appel récursif et l'appel imbriqué ne peut pas ouvrir un curseur du même nom jusqu'à ce que l'appel parent ferme le curseur. Si possible, pouvez-vous rendre le nom du curseur dynamique, peut-être quelque chose d'aussi simple que SOME_CURSOR_{$RECURSION_DEPTH}, et vous devrez peut-être ajouter la profondeur de récursivité comme paramètre à la procédure. Je n'ai jamais fait quelque chose comme ça dans SQL Server mais je ne suis pas sûr à 100%.

Vous n'êtes pas sûr du prochain problème d'insertion/insertion, bien qu'il puisse être lié au curseur.

0
DECLARE StudentdIDCursor CURSOR LOCAL FOR SELECT ...blahblah 

La clé est le terme LOCAL. Il générera une définition de curseur séparée derrière les scènes à chaque fois.

Questions connexes