Comment puis-je combiner des ensembles de résultats à partir de deux appels de procédures stockées?
J'ai une procédure stockée suivante
CREATE PROCEDURE [dbo].[MyStored]
@state int
AS
SELECT blahblahblah WHERE StoredState=@state LotsOfJoinsFollow;
RETURN 0
et j'aimerais l'appeler une procédure stockée avec @etat 0
et 1
et ont les ensembles de résultats retournés par les deux appels combiné avec UNION
sémantique alors que j'ai un nouveau jeu de résultats qui comporte des lignes de fois le premier appel et le second appel.
Quelque chose comme (imaginaire SQL):
(EXEC MyStored 0) UNION (EXEC MyStored 1);
Comment puis-je y parvenir?
Êtes-vous d'accord avec le fait d'avoir le @de l'état une liste délimitée par des virgules? (par exemple, etat = '0,1') - la solution est différente en fonction de votre réponse.
K: je ne suis pas sûr, je préfère un facile de maintenir la solution.
dupliquer: stackoverflow.com/questions/5292069/...
Combien de valeurs différentes pourrait StoredState?
Si vous déplacez la logique dans une TABLE au lieu de cela il vous suffit de faire comme une union de 2 sélectionne.
K: je ne suis pas sûr, je préfère un facile de maintenir la solution.
dupliquer: stackoverflow.com/questions/5292069/...
Combien de valeurs différentes pourrait StoredState?
Si vous déplacez la logique dans une TABLE au lieu de cela il vous suffit de faire comme une union de 2 sélectionne.
OriginalL'auteur sharptooth | 2011-12-29
Vous devez vous connecter pour publier un commentaire.
Cela peut être trop simplifier le problème, mais si vous avez le contrôle sur la sp, il suffit d'utiliser plutôt que de =:
Si ce n'est pas une option, il suffit d'appuyer sur les résultats de la procédure stockée appels dans une table temporaire:
INSERT
, sinon vous obtiendrez un message d'erreur:An INSERT EXEC statement cannot be nested.
OriginalL'auteur brian
OriginalL'auteur adyusuf
Alternativement à une série de déclarations comme celles-ci:
vous pouvez utiliser un
INSERT ... EXEC
déclaration comme ci-dessous:Les résultats des deux appels à
MyStored
seraient Réunies (ou, plutôt, de l'UNION Appeler), tout comme avec l'ancienne méthode.OriginalL'auteur Andriy M
Un long chemin serait de créer un wrapper qui fait cela - une fonction qui prend une liste d'états et les ajoute à une table finale qui serait retourné.
Vous pourriez aussi avoir tout ce que la technologie est l'appel de cette procédure ne le concatination d'enregistrements (c'est à dire avoir .NET ajouter l'ensemble des résultats de chaque état vous êtes à la recherche)
Si vous êtes fine avec passant dans une liste de membres de votre 'état' param, vous pouvez créer une dynamique de requêtes sql
Cela fonctionne très bien pour de simples procédures; bien que, il peut prendre plus de temps à maintenir si des changements sont nécessaires en bas de la route.
.
Ici est un CodeProject Article et un MS SQL Article de Conseils qui permet de mieux entrer dans les détails
.
EDIT: Le param @etat aura besoin d'être un type nVarChar depuis votre passage dans une liste délimitée par des virgules de valeurs int
OriginalL'auteur Ray K
Si la procédure stockée que vous appelez a une table temporaire avec le même nom que dans la procédure d'appel, vous obtiendrez cette erreur.
par exemple sp1 a temp tableau #résultats
sp2 create table #résultats(champs)
puis d'essayer de les insérer dans #les résultats dans le sp2 le résultat de l'appel sp1 échoue avec ce message d'erreur. changement de table temporaire dans le service pack 2 de #résultat et essayer de nouveau et vous devriez voir cela fonctionne à présent.
OriginalL'auteur Alan Browne