2010-02-11 29 views
60

Come si assegna il risultato di una chiamata exec a una variabile in SQL? Ho un proc memorizzato chiamato up_GetBusinessDay, che restituisce una singola data.Come assegnare un risultato exec a una variabile sql?

può fare qualcosa di simile:

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

è questo per SQL Server? il tuo codice sembra TSQL. Se lo è, otterrai più visualizzazioni e risposte se lo tagghi "sql-server" –

risposta

59

Uso sempre il valore restituito per passare lo stato di errore. Se devi restituire un valore, utilizzerei un parametro di output.

stored procedure di esempio, con un parametro OUTPUT:

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 

chiamata alla stored procedure, con un parametro OUTPUT:

DECLARE @OutputParameter datetime 
     ,@ReturnValue  int 

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

USCITA:

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

Utilizzando un parametro OUTPUT, è possibile restituire qualsiasi tipo di dati, il valore RETURN da una stored procedure può essere solo un numero intero. –

+0

+1: d'accordo, grazie per il tuo commento. –

+1

Solo una nota a margine, i parametri OUTPUT dichiarati con un valore non devono essere passati. Ciò significa che se stai modificando un SP esistente puoi farlo in sicurezza senza rischiare di rompere nulla. ad es., @ Param3 datetime = '1900-01-01' OUTPUT. – Morvael

5

Dal documentation (supponendo che si utilizza SQL-Server):

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

Quindi sì, dovrebbe funzionare in questo modo.

+7

nell'esempio dell'OP che vogliono restituire una data, le stored procedure possono solo restituire un valore intero a una procedura chiamante o un'applicazione. –

34

questo funzionerà se desideri semplicemente restituire un numero intero:

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

-1 Questo restituirà solo un numero intero. L'OP vuole restituire una data. La risposta accettata da @KM. è la risposta corretta, poiché usa OUTPUT anziché RETURN. –

+3

In realtà questo funziona. L'esempio su come ottenere un numero intero che viene restituito, puoi fare lo stesso per tutti gli altri tipi (non ho controllato se la tabella è possibile, ma penso di sì.) L'ho appena provato per nvarchar (50). – Mzn

+1

@Mzn * "puoi fare lo stesso per tutti gli altri tipi" *, certamente non funziona con '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

in realtà l'unico modo di lavorare qui descritto oltre a cambiare la firma dello store memorizzato –

+1

Usato anche per una data, quando il sottostante Sproc non ha neanche un parametro di output. (Sotto sproc aveva un altro Exec al suo interno da SQL dinamico) –

+2

@MichaelSander Totalmente a destra, tutte le altre soluzioni ** non ** rispondono correttamente alla domanda degli OP. L'unico modo è una tabella temporanea che contiene i risultati. –

Problemi correlati