2009-02-20 28 views
6

Tengo un procedimiento almacenado que devuelve un valor. Lo llamo desde otros procedimientos almacenados que necesitan recuperar este valor. El procedimiento almacenado de llamada está dentro de una transacción, el procedimiento almacenado que devuelve el valor (y realmente crea el valor y lo almacena en una tabla que ningún otro proceso toca) no está dentro de su propia transacción, sino que sería parte de la transacción de la persona que llama.¿Cuál es la mejor manera de asignar el valor devuelto de un proceso almacenado a una variable en SQL?

La pregunta es: ¿cuál es la forma más eficiente de recuperar el valor de retorno del procedimiento almacenado y almacenarlo en una variable en el proceso de llamada?

Actualmente tengo lo siguiente y me pregunto si es muy ineficiente?

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

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

¿No hay una manera más directa de hacer esto? ¿No es esta una forma costosa (en términos de rendimiento)?

Mi proc almacenado no tiene un parámetro de salida, simplemente devuelve un valor. ¿Sería más rápido usar un parámetro de salida?

Por lo que vale la pena que estoy usando MS SQL Server 2005

Respuesta

13

Si su conseguir una única variable de retorno, entonces sí esto se innefficent que puede hacer:

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

interesante, no sabía que era constructo válido. Entonces el ejemplo que di es crear una tabla temporal. ¿Qué tan ineficiente describirías que era, muy o no sería notable a menos que se llamara decenas de miles de veces? – ApplePieIsGood

+0

difícil de decir, su tabla es una variable de tabla por lo que todo debe estar en la memoria. ¿Por qué no ejecutar una prueba en su sistema para medir la diferencia por los dos? – JoshBerke

1

¿Es esta Proc devolver un conjunto de filas de 1 fila y 1 columna o ningún conjunto de filas y solo quieres capturar el código de retorno?

Si desea sólo el código de retorno a continuación, utilizar el método de Josh lo contrario usar un parámetro SALIDA sicne será mucho más rápido que lo que está haciendo ahora

para explicar lo que quiero decir ejecutar este código

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

Ver How to Share Data Between Stored Procedures
Por algunas razones 'exec @localVariable = GetMyValue' no funciona para mí (MS SQL 2005), siempre devuelve valor 0 (They have the same issue).

Mi opinión es:
si puede cambiar el procedimiento almacenado, agregue el parámetro de salida.
else si puede eliminar el procedimiento, vuelva a escribirlo como una función.
else usa la variable de tabla, como lo haces.

+1

Siempre será 0 a menos que tenga una devolución en el proceso o ocurra un error, ejecute el código que proporcioné – SQLMenace

+0

Solo estoy interesado en un valor de retorno. ¿Usaré el método de Josh será más lento o más rápido que un parámetro de salida cuando todo lo que quiero es obtener ese valor de retorno o un valor específico (no tiene que ser un valor de retorno, solo un valor que he creado dentro de este proceso). Parece que cualquiera es más rápido que estoy haciendo actualmente. – ApplePieIsGood

+0

2SQLMenace - sí, tienes razón. funciona con retorno. –

0

Prueba esto:

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] 
Cuestiones relacionadas