2014-07-25 7 views
0

J'ai deux procédures stockées assez volumineuses et complexes. Je veux appeler une deuxième procédure stockée à partir de la première procédure stockée. Par exemple:Appel d'une procédure stockée à partir d'une autre procédure stockée

-- stored_procedure_one 
select tb1.col1, tb1.col2, sp1.col3, sp1.col4 
from table1 tb1 
inner join stored_procedure_two sp1 on sp1.col1 = tbl1.col1 

Est-ce quelque chose de similaire possible avec SQL que le script ci-dessus me donne un message d'erreur d'objet non valide.

L'utilisation d'une table temporaire n'est pas bonne dans cet exemple, car si je le faisais, il me faudrait une heure pour remplir la table temporaire avec toutes les données de la deuxième procédure stockée. Je veux seulement la procédure stockée pour retourner les données nécessaires.

+1

Avez-vous vraiment besoin des 50 millions de lignes ou d'enregistrements de sortie additionnés en fonction de certains identifiants? Vous devriez probablement repenser votre requête et en créer une qui est plus adaptée à ce cas particulier que d'essayer de mélanger deux requêtes séparées dans une requête frankenstein parce que vous ne vouliez pas refactoriser. Le temps passé pourrait en valoir la peine. –

Répondre

3

Cela ne va pas fonctionner. Vous ne pouvez pas rejoindre une procédure stockée. Toutefois, vous pouvez envisager de remplacer stored_procedure_two par table-valued user defined function. Vous pouvez ensuite «rejoindre» via une application croisée. Je l'ai fait à plusieurs reprises et cela fonctionne très bien.

Si la deuxième procédure stockée est trop grande et complexe, il peut ne pas être possible de la convertir en un fichier UDF. Dans ce cas, je pense que votre seule alternative est de sauvegarder les résultats du second proc stocké dans une table et de vous joindre à cela. Mais cela pourrait être un peu inefficace et désordonné.

+0

Cela semble plus raisonnable que d'utiliser pré-remplir une table de temp avec 50 millions lignes Je vais vérifier maintenant. Merci. – oshirowanen

+0

Une vue serait-elle possible? i.e a la complexité de la procédure stockée deux dans une vue, puis jointure interne avec la vue dans la procédure stockée un? – oshirowanen

+0

nous avons besoin de voir la procédure pour vous dire que – OGHaza

0

Vous pouvez ajouter les résultats de la deuxième procédure dans une table variable locale

DECLARE @Table TABLE 
(
    Col1 int, 
    Col2 ... 
) 

INSERT INTO @Table 
EXEC stored_procedure_two 

select tb1.col1, tb1.col2, sp1.col3, sp1.col4 
from table1 tb1 
inner join @Table tbl2 on sp1.col1 = tbl1.col1 
+0

Comme j'ai essayé d'expliquer dans le dernier paragraphe de ma question, je ne pense pas que ce soit très pratique pour ma situation spécifique. – oshirowanen

+0

Yeap, remarqué que maintenant. Eh bien, si vous voulez le sp, c'est une façon de le faire. L'autre façon est comme suggéré d'avoir une fonction de valeur table. Mais même cela conduirait à avoir le même code deux fois. –

+0

@OGHaza, je ne peux pas faire cela parce que si j'exécute la procédure stockée deux dans son intégralité, cela prend environ une heure, c'est pourquoi je voulais seulement exécuter une partie de la procédure stockée une et une jointure interne pour obtenir seulement les données requises de la procédure stockée deux. – oshirowanen

Questions connexes