2009-02-20 8 views
6

J'ai une procédure stockée qui retourne une valeur que je l'appelle d'autres procédures stockées qui ont besoin de récupérer cette valeur. La procédure stockée appelant est dans une transaction, la procédure stockée qui renvoie la valeur (et crée réellement la valeur et la stocke dans une table qu'aucun autre proc touche) n'est pas dans sa propre transaction, mais ferait partie de la transaction de l'appelant.Quelle est la meilleure façon d'affecter la valeur renvoyée d'un proc stocké à une variable dans SQL?

La question est la suivante: quel est le moyen le plus efficace de récupérer la valeur de retour de la procédure stockée et de la stocker dans une variable du processus appelant?

Actuellement, j'ai ce qui suit et je me demande si c'est très inefficace?

DECLARE @tmpNewValue TABLE (newvalue int) 
INSERT INTO @tmpNewValue EXEC GetMyValue 

DECLARE @localVariable int 
SET @localVariable = (SELECT TOP 1 newvalue FROM @tmpNewValue) 

N'y a-t-il pas une façon plus directe de le faire? N'est-ce pas une manière coûteuse (en termes de performance)?

Mon proc stocké n'a pas de paramètre de sortie, il renvoie simplement une valeur. L'utilisation d'un paramètre de sortie serait-elle plus rapide?

Pour ce que ça vaut que je utilise MS SQL Server 2005

Répondre

13

Si obtenir une seule variable de retour alors oui cela est innefficent que vous pouvez faire:

declare @localVariable int 
exec @localVariable =GetMyValue 
select @localVariable 
+0

Intéressant, ne savait pas cette construction était valide. Donc l'exemple que j'ai donné crée une table temporaire. Dans quelle mesure le décririez-vous comme inefficace, très ou ne serait-il pas perceptible à moins qu'il ne soit appelé des dizaines de milliers de fois? – ApplePieIsGood

+0

difficile à dire, votre table est une variable de table donc tout devrait être en mémoire. Pourquoi ne pas faire un test sur votre système de mesure de la différence entre les deux? – JoshBerke

1

Est-ce proc retourner un ensemble de lignes 1 ligne et 1 colonne ou aucun ensemble de lignes du tout et vous voulez juste capturer le code de retour?

Si vous voulez juste l'returnCode puis utilisez la méthode de Josh autrement utiliser un paramètre de SORTIE sicne il sera beaucoup plus rapide que ce que vous faites maintenant

Pour expliquer ce que je veux dire exécuter ce code

use tempdb 
go 

create proc GetMyValue 
as 
select 1 
go 


create table #temp (id int) 
declare @localVariable int 

insert #temp 
exec @localVariable =GetMyValue 
select @localVariable,* from #temp 
3

Voir How to Share Data Between Stored Procedures
Pour certaines raisons 'exec @localVariable = GetMyValue' ne fonctionne pas pour moi (MS SQL 2005), il renvoie toujours la valeur 0 (They have the same issue).

Mon opinion est:
si vous pouvez modifier la procédure stockée, ajouter un paramètre de sortie.
Sinon, si vous pouvez supprimer la procédure, réécrivez-la en tant que fonction. Sinon, utilisez la variable table, comme vous le faites.

+1

Il sera toujours 0 sauf si vous avez un retour dans le proc ou une erreur se produit, exécutez le code que j'ai fourni – SQLMenace

+0

Je suis seulement intéressé par une valeur de retour. Est-ce que l'utilisation de la méthode de Josh sera plus lente ou plus rapide qu'un paramètre de sortie quand tout ce que je veux est d'obtenir cette valeur de retour ou une valeur spécifique (elle ne doit pas nécessairement être une valeur de retour). Semble soit est plus rapide que je suis en train de faire. – ApplePieIsGood

+0

2SQLMenace - oui, vous avez raison. ça marche avec le retour. –

0

Essayez ceci:

create proc AvilableSeats 
as 
declare @v1 int,@v2 int 
exec @v1= determinPath_Capacity 1,'Sat-Tue',32 
exec @v2=Student_fGroup '6/12/2009' 
select @[email protected] 
Questions connexes