2010-02-11 4 views
60

Comment affectez-vous le résultat d'un appel exec à une variable dans SQL? J'ai un proc stocké appelé up_GetBusinessDay, qui renvoie une seule date.Comment affecter un résultat exec à une variable sql?

Pouvez-vous faire quelque chose comme ceci:

exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1 
+3

est-ce pour SQL Server? votre code ressemble à TSQL. Si c'est le cas, vous obtiendrez plus de vues et de réponses si vous le marquez "sql-server" –

Répondre

59

J'utilise toujours la valeur de retour pour renvoyer l'état d'erreur. Si vous devez renvoyer une valeur, j'utiliserais un paramètre de sortie.

échantillon

procédure stockée, avec un paramètre de SORTIE:

CREATE PROCEDURE YourStoredProcedure 
(
    @Param1 int 
    ,@Param2 varchar(5) 
    ,@Param3 datetime OUTPUT 
) 
AS 
IF ISNULL(@Param1,0)>5 
BEGIN 
    SET @Param3=GETDATE() 
END 
ELSE 
BEGIN 
    SET @Param3='1/1/2010' 
END 
RETURN 0 
GO 

appel à la procédure stockée, avec un paramètre de SORTIE:

DECLARE @OutputParameter datetime 
     ,@ReturnValue  int 

EXEC @ReturnValue=YourStoredProcedure 1,null, @OutputParameter OUTPUT 
PRINT @ReturnValue 
PRINT CONVERT(char(23),@OutputParameter ,121) 

SORTIE:

0 
2010-01-01 00:00:00.000 
+7

En utilisant un paramètre OUTPUT, vous pouvez retourner n'importe quel type de données, la valeur RETURN d'une procédure stockée ne peut être qu'un nombre entier. –

+0

+1: D'accord, merci pour votre commentaire. –

+1

Juste une note de côté, les paramètres OUTPUT qui sont déclarés avec une valeur n'ont pas besoin d'être transmis. Cela signifie que si vous modifiez un SP existant, vous pouvez le faire en toute sécurité sans risquer de casser quoi que ce soit. Par exemple, @ Param3 datetime = '1900-01-01' OUTPUT. – Morvael

5

De l'documentation (en supposant que vous utilisez SQL Server):

USE AdventureWorks; 
GO 
DECLARE @returnstatus nvarchar(15); 
SET @returnstatus = NULL; 
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2; 
PRINT @returnstatus; 
GO 

Alors oui, il devrait fonctionner de cette façon.

+7

dans l'exemple de l'OP, ils veulent retourner une date, Les procédures stockées ne peuvent renvoyer une valeur entière à une procédure appelante ou une application. –

34

Cela fonctionne si vous souhaitez simplement renvoyer un nombre entier:

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter' 
SELECT @ResultForPos 
+8

-1 Cela ne retournera qu'un entier. L'OP veut retourner une date. La réponse acceptée par @KM. est la bonne réponse, car elle utilise OUTPUT au lieu de RETURN. –

+3

En fait, cela fonctionne. L'exemple de comment obtenir un entier qui est retourné, vous pouvez faire la même chose pour tous les autres types (n'a pas vérifié si la table est possible, mais je pense que oui.) Je l'ai juste essayé pour nvarchar (50). – Mzn

+1

@Mzn * "vous pouvez faire la même chose pour tous les autres types" *, ne fonctionne certainement pas avec 'UNIQUEIDENTIFIER'. – James

20
declare @EventId int 

CREATE TABLE #EventId (EventId int) 

insert into #EventId exec rptInputEventId 

set @EventId = (select * from #EventId) 

drop table #EventId 
+2

en fait la seule méthode de travail décrite ici en dehors de la modification de la signature du proc mémorisée –

+1

Utilisé aussi pour une date, lorsque le Sproc sous-jacent n'a pas non plus de paramètre de sortie. (Sous-jacent sproc avait un autre Exec à l'intérieur de SQL dynamique) –

+2

@MichaelSander Tout à fait raison, toutes les autres solutions ** ne sont pas ** répondre correctement à la question OPs. Le seul moyen est une table temporaire qui contient les résultats. –

Questions connexes