2011-03-25 15 views
12

¿Es posible asignar a la variable un valor devuelto por el procedimiento almacenado de exec?set @var = exec stored_procedure

Algo así como

DECLARE @count int 
SET @count = Execute dbo.usp_GetCount @Id=123 
+0

pregunta yopur pregunta por 'exec @ sql' pero el ejemplo que da a las llamadas de un procedimiento almacenado. ¿Que necesitas? –

Respuesta

24

Se puede utilizar en lugar de sp_executesqlexec para asignar a los parámetros de salida escalares

DECLARE @out int 

EXEC sp_executesql N'select @out_param=10', 
        N'@out_param int OUTPUT', 
        @[email protected] OUTPUT 

SELECT @out 

Para exec sólo soy consciente de cómo hacerlo usando una tabla de variables

declare @out table 
(
out int 
) 

insert into @out 
exec('select 10') 

select * 
from @out 

Para pro almacenado Además, también utilizará un parámetro output o un código de retorno. Este último solo puede devolver un entero único y generalmente se prefiere para devolver códigos de error en lugar de datos. Ambas técnicas se demuestran a continuación.

create proC#foo 
@out int output 
as 
set @out = 100 
return 99 

go 

declare @out int, @return int 

exec @return = #foo @out output 

select @return as [@return], @out as [@out] 

drop proC#foo 
+0

gracias. Quiero hacer algo como esto en mi SP; CON XMLNAMESPACES (DEFAULT 'http://abc.com') SET @out = (SELECT XmlResult.value ('count (// subject/subject)', 'int') FROM @XmlTable) Pero obtengo un error de sintaxis. Esto me está volviendo loco – BumbleBee

+0

Use 'SELECT @out = XmlResult.value' para asignarlo a una variable escalar. –

+0

Gracias. Veo el mensaje (1 Filas afectadas) pero no los resultados con SELECt @out = xmlResult.Value ... ¿Cómo puedo ver los resultados? – BumbleBee

23

Si utiliza RETURN en el proc

DECLARE @count int 
EXECUTE @count = dbo.usp_GetCount @Id=123 

parámetro OUTPUT

DECLARE @count int 
EXECUTE dbo.usp_GetCount @Id=123, @count OUTPUT 

redirigir los resultados a la tabla temporal/tabla de variables

DECLARE @count int 
DECLARE @cache TABLE (CountCol int NOT NULL) 
INSERT @cache EXECUTE dbo.usp_GetCount @Id=123 
SELECT @count = CountCol FROM @cache 

No se puede asignar un conjunto de registros del proceso almacenado directamente a una variable escalar

10

Como de costumbre muchas maneras de hacer esto, pero la más fácil es:

DECLARE @count int 

Execute @count = dbo.usp_GetCount @Id=123 
+1

Sí, esto funcionará, pero si no quiere que lo hagamos, ingrese el valor de conteo y simplemente úselo. Esto no funcionará. – Abe