2008-10-23 4 views
2

J'ai une procédure stockée qui annule une série d'opérations. Je veux appeler cela d'un autre SP.Appel d'un process enregistré à partir d'un process enregistré et renvoi d'un jeu d'enregistrements

Le problème est que le SP interne renvoie un jeu d'enregistrements avec une seule valeur qui indique le degré de réussite.

Cette approche a bien fonctionné et présente quelques avantages dans notre contexte, mais rétrospectivement, je l'aurais fait de la manière conventionnelle avec une valeur de retour ou un paramètre de sortie.

I pourrait toujours changer ce SP pour utiliser cette approche et modifier le code appelant, mais a) Je ne veux pas jouer avec plus de code que je dois, et b) Au niveau intellectuel, je Je suis curieux de voir quelle solution de rechange il pourrait y avoir, le cas échéant.

Comment (le cas échéant) puis-je appeler ce SP et déterminer la valeur du jeu d'enregistrements singleton retourné?

Merci

Répondre

7

Une procédure stockée renvoie un jeu d'enregistrements comme les autres, donc vous pouvez réellement faire ceci:

INSERT INTO MyTable ( MyValue )

EXEC dbo.MyStoredProcedure

L'EXEC prend la place d'une instruction SELECT. Pour obtenir la valeur, sélectionnez simplement dans la table que vous avez insérée. Typiquement, ce serait une table temporaire.

+0

Vous pouvez également insérer dans une table temporaire (pas une table en mémoire). Donc, en d'autres termes, vous pouvez insérer dans #MyTempTable, mais pas @MyOtherTempTable. –

1

L'autre option consiste à convertir la procédure stockée qui renvoie un jeu d'enregistrements en une fonction qui renvoie une table.

L'approche de Ant est probablement la meilleure si vous voulez minimiser les changements sur votre système.

Normalement, vous utiliseriez une table temporaire pour cette approche car vous ne pouvez pas utiliser une instruction exec à insérer dans une variable de table.

1

Voici une variante qui fonctionnera bien si vous devez l'utiliser pour plusieurs jeux d'enregistrements.

CREATE TABLE #outsidetable (...) 
exec spInsideProcedure 
SELECT * FROM #outsidetable 

intérieur spInsideProcedure

INSERT INTO #outsidetable SELECT <blah blah blah> 
0

J'ai essayé l'approche Ant et cela a fonctionné un régal:

 
Declare @Success tinyint 
Declare @Response Table (Success int) 
Insert into @Response(Success) 
Exec Fix_RollbackReturn 12345, 15 
Select @Success=Success from @Response 

Comme vous pouvez le voir je une table variable plutôt qu'une table temporaire, car un peu plus efficace qu'une table temporaire.

Merci pour votre aide les gars.

EDIT: Il semble que Dave avait raison après tout. C'est-à-dire que mon approche Exec-into-Table-variable a fonctionné sur ma machine de développement SQL2005, mais lorsqu'elle a été déplacée vers la machine Live (SQL2000), elle s'est opposée, donc j'ai dû passer à la table temporaire.

C'est un peu ennuyeux, d'autant plus que dans quelques semaines, nous passons à SQL2005 (!).

Questions connexes