Come assegnare un risultato exec a una variabile sql?


108

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

Puoi fare qualcosa del genere:

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

Risposte:


97

Uso sempre il valore di ritorno per restituire lo stato di errore. Se è necessario restituire un valore, utilizzare un parametro di output.

procedura memorizzata 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)

PRODUZIONE:

0
2010-01-01 00:00:00.000

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

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

55

Funzionerà se desideri restituire semplicemente un numero intero:

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

13
-1 Questo restituirà solo un numero intero. L'OP vuole restituire una data. La risposta accettata da @KM. è la risposta corretta, poiché utilizza OUTPUT invece di RETURN.
Code Maverick

4
In realtà 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

2
@ Mzn "puoi fare lo stesso per tutti gli altri tipi" , certamente non funziona con UNIQUEIDENTIFIER.
James,

1
@ James Why? Cosa c'è di diverso nel tipo di dati identificativo univoco? Le stored procedure non possono restituire identificatori univoci?
Mzn

3
@Mzn UNIQUEIDENTIFIERera solo un esempio, RETURNè progettato per funzionare solo con valori interi, vedere la documentazione . Il modo consigliato per ottenere altri dati da un SP è restituire un set di risultati o utilizzareOUTPUT
James,

34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
in realtà l'unico modo di lavoro descritto qui oltre a cambiare la firma del proc memorizzato
Michael Sander

2
Usato anche per una data, quando lo Sproc sottostante non ha nemmeno un parametro di output. (Sottostante sproc aveva un altro Exec al suo interno da SQL dinamico)
Jeff Beagley,

3
@MichaelSander Completamente corretto, tutte le altre soluzioni non rispondono correttamente alla domanda dei PO. L'unico modo è una tabella temporanea che contiene i risultati.
SQL Police

3
L'unico modo che funziona qui senza richiedere modifiche al proc, cosa che non posso fare nel mio caso. +1
DLeh

È inoltre possibile utilizzare una variabile di tabella al posto di una tabella temporanea.
errore

6

Dalla documentazione (supponendo che utilizzi 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.


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

0

Ho avuto la stessa domanda. Sebbene ci siano buone risposte qui, ho deciso di creare una funzione con valori di tabella. Con una funzione con valori di tabella (o scalare) non è necessario modificare il processo memorizzato. Ho semplicemente fatto una selezione dalla funzione con valori di tabella. Notare che il parametro (MyParameter è facoltativo).

CREATE FUNCTION [dbo].[MyDateFunction] 
(@MyParameter varchar(max))
RETURNS TABLE 
AS
RETURN 
(
    --- Query your table or view or whatever and select the results.
    SELECT DateValue FROM MyTable WHERE ID = @MyParameter;
)

Per assegnare alla tua variabile puoi semplicemente fare qualcosa come:

Declare @MyDate datetime;
SET @MyDate = (SELECT DateValue FROM MyDateFunction(@MyParameter));

Puoi anche usare una funzione con valori scalari:

CREATE FUNCTION TestDateFunction()  
RETURNS datetime  
BEGIN  
    RETURN (SELECT GetDate());
END

Quindi puoi semplicemente fare

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.