2012-09-13 26 views
5

Tengo un procedimiento almacenado que calcula varios valores y SELECT Son ellos:¿Cómo se usa el resultado de SELECT en un procedimiento almacenado en otro procedimiento de srored?

CREATE PROCEDURE [dbo].[MyProc] 
AS 
    DECLARE @value1 int; 
    DECLARE @value2 int; 
    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 
    SELECT @value1 AS Value1, @value2 AS Value2; 
RETURN 0; 

Sé que puedo convertir eso en una función de tabla, pero preferiría no hacerlo debido a RETURN en el medio - a veces hay nada para volver.

Quiero llamar a ese procedimiento almacenado desde otro procedimiento almacenado y utilizar los valores recuperados por SELECT en el otro procedimiento. ¿Cómo puedo hacer eso?

+0

duplicado de http://stackoverflow.com/questions/1184325/how-to-call-a-stored-procedure-from-other-stored-procedure – Jodrell

+0

duplicado de http://stackoverflow.com/questions/3039200/tsql-call-a-stored-procedure-from-another-stored-procedure-and-read-the-result – Jodrell

+0

antes de cubrir la antigua base de TSQL, siempre debe consultar este sitio http://www.sommarskog.se/share_data .html – Jodrell

Respuesta

2

Puede crear una temptable e insertar ambos valores allí.

CREATE TABLE #Temp (value1 int, value2 int) 

INSERT INTO #Temp (value1, value2) 
EXEC [dbo].[MyProc] 

Si Valor1 es NULL no habrá registro en #Temp, y en este caso no es necesario el retorno 0.

Pero si no es su objetivo, y hay que devolver 0 , entonces debe usar @ value1 y @ value2 como parámetros de salida.

+0

¿Puedo controlar qué columna del 'SELECT' va a qué columna de la tabla? – sharptooth

+0

Sí, pero solo si la cantidad de columnas y los tipos coinciden. Como INSERT INTO #Temp (value1, value2) e INSERT INTO #Temp (value2, value1) también es posible. Pero no puede escribir una selección en su declaración EXEC ... La orden de devolución del procedimiento almacenado se define allí. –

+0

Esta respuesta es muy útil, solo agregaré que se puede usar una variable de tabla en lugar de una temptable. – sharptooth

2

Puede añadir parámetros de salida:

CREATE PROCEDURE [dbo].[MyProc] 
(
    @value1 int = null output, 
    @value2 int = null output 
) 
AS 

    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 
    SELECT @value1 = Value1, 
      @value2 = Value2; 
RETURN 0; 

y utilizarla:

declare @v1 int, 
     @v2 int 

exec MyProc @v1 out, @v2 out 

select @v1, @v2 

o si necesita más valores que puede utilizar tabla temporal

create table #tmp 
(
    val1 int null, 
    val2 int null 
) 

CREATE PROCEDURE [dbo].[MyProc] 
AS 

    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 

    insert into #tmp 
    SELECT Value1, Value2 
    from tab 

RETURN 0; 

y utilizarla:

create table #tmp 
(
    val1 int null, 
    val2 int null 
) 

exec MyProc 

select * 
from #tmp 

drop table #tmp 
+0

Recomendaría cambiar la devolución 0 al final de myproc a 1. Entonces puede hacer (en el proceso almacenado que realiza la llamada) 'DECLARE @Exists bit; exec @Exists = MyProc; Si @Exists ... Else ... 'solo permite checkin si el valor 1 fue nulo sin usar un conteo en la temperatura y cosas – Manatherin

+0

Sí, por supuesto, pero quería mostrar cómo tomar valores, nada más. – Parado

Cuestiones relacionadas