2010-02-11 9 views
60

¿Cómo se asigna el resultado de una llamada ejecutiva a una variable en SQL? Tengo un proceso almacenado llamado up_GetBusinessDay, que devuelve una sola fecha.¿Cómo asignar un resultado ejecutivo a una variable sql?

¿Se puede hacer algo como esto:

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

¿Esto es para SQL Server? tu código se parece a TSQL. Si es así, obtendrá más vistas y respuestas si lo etiqueta "sql-server" –

Respuesta

59

Siempre utilizo el valor de retorno para devolver el estado de error. Si necesita devolver un valor, usaría un parámetro de salida.

muestra de procedimiento almacenado, con un Parámetro de salida:

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 

llamada al procedimiento almacenado, con un Parámetro de salida:

DECLARE @OutputParameter datetime 
     ,@ReturnValue  int 

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

SALIDA:

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

Al utilizar un parámetro OUTPUT, puede devolver cualquier tipo de datos, el valor RETORNO de un procedimiento almacenado solo puede ser un número entero. –

+0

+1: De acuerdo, gracias por tu comentario. –

+1

Como nota al margen, los parámetros OUTPUT que se declaran con un valor no necesitan ser pasados. Esto significa que si está alterando un SP existente puede hacerlo de manera segura sin arriesgarse a romper nada. por ejemplo, @ Param3 datetime = '1900-01-01' OUTPUT. – Morvael

5

Desde el documentation (suponiendo que se utiliza SQL-Server):

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

Así que sí, debería funcionar de esa manera.

+7

en el ejemplo del OP que desea devolver una fecha, los procedimientos almacenados solo pueden DEVOLVER un valor entero a un procedimiento de llamada o una aplicación. –

34

Esto funcionará si desea simplemente devolver un número entero:

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

-1 Esto solo devolverá un número entero. El OP quiere devolver una fecha. La respuesta aceptada por @KM. es la respuesta correcta, ya que usa OUTPUT en lugar de RETURN. –

+3

En realidad esto funciona. El ejemplo de cómo obtener un entero que se devuelve, puede hacer lo mismo para todos los demás tipos (no se verificó si la tabla es posible, pero creo que sí). Lo intenté con nvarchar (50). – Mzn

+1

@Mzn * "puede hacer lo mismo para todos los demás tipos" *, ciertamente no funciona 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

en realidad la única forma de trabajo descrita aquí aparte de cambiar la firma del proc almacenado –

+1

Se usa esto también para una fecha, cuando el Sproc subyacente tampoco tiene un parámetro de salida. (Sproc subyacente tenía otro Exec dentro del SQL dinámico) –

+2

@MichaelSander Totalmente correcto, todas las demás soluciones ** ** responden correctamente a la pregunta de OPs. La única forma es una tabla temporal que contiene los resultados. –

Cuestiones relacionadas