8

tengo la siguiente declaración en un procedimiento almacenado:¿Cómo usar un valor de un procedimiento almacenado en otro?

DECLARE @Count INT 
EXEC @Count = GetItemCount 123 
SELECT @Count 

que llama a otro procedimiento almacenado con la siguiente declaración en el interior:

SELECT COUNT(Item) FROM tblItem WHERE ID = @ID 

Sin embargo cuando pruebo la llamada EXEC emite el valor correctamente, pero no está asignado a la variable @Count correctamente. He visto ejemplos o procedimientos almacenados utilizados de esta manera, incluso aquí, pero ninguno tenía un parámetro y un valor de retorno utilizado (que pude encontrar). El parámetro ID se pasa a la segunda instrucción que devuelve un valor de recuento utilizado por el primer StoredProcedure; toda la información que he leído parece indicar que esto debería funcionar, pero el valor @Count no es cero, incluso cuando el GetItemCount devuelve siempre el valor correcto.

Esto está en Microsoft SQL Server 2008 si eso ayuda.

+0

pude conseguir que esto funcione - que tiene una salida como parámetro fue la solución - olvido de SQL no es como el estilo de programación al que estoy acostumbrado. – RoguePlanetoid

Respuesta

22

En el procedimiento almacenado, son que o bien

a) Asignar el valor de la cuenta a un parámetro de salida:

CREATE PROCEDURE GetItemCount 
    @id INT, 
    @count INT OUTPUT 
AS 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

llama como:

DECLARE @count INT 
EXEC GetItemCount 123, @count OUTPUT 

o, b) Asignación del valor de conteo como el valor de retorno:

CREATE PROCEDURE GetItemCount 
    @id INT 
AS 
BEGIN 
    DECLARE @count INT 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

    RETURN @count 
END 

llama como:

DECLARE @count INT 
EXEC @count = GetItemCount 123 
+0

Gracias por esto - funcionó - no creía que un resultado fuera un parámetro - es por eso que no pude entenderlo. Trataba el resultado de la pantalla como salida cuando en realidad no se devolvía nada - por lo tanto, era cero cuando Leo el valor – RoguePlanetoid

+0

He buscado este problema varias veces desde que hice esta pregunta y volví aquí y encontré la solución, ¡deseo que pudiera votar cada vez que me ayudó! – RoguePlanetoid

2

Debe pasar @Count como parámetro de salida.

Create Proc dbo.usp_Proc1 

@Id int, 
@Count int output 

as begin 

select @Count = Count(Item) from tblItem where [email protected] 

end 
Go 

Declare @Count int 
Declare @Id int 

Set @Id = 1 

Exec dbo.usp_Proc1 @Id, @Count output 

select @Count 
+0

Este ejemplo también fue útil para que mi consulta funcione correctamente, así que gracias de nuevo. – RoguePlanetoid

0

Lo que se captura en el @Count variable es el estado de ejecución del procedimiento almacenado GetItemCount y no el valor que usted está esperando. Para capturar ese valor, tienes dos formas.

  1. Declarar otro parámetro @count como OUTPUT en GetItemCount. Por lo que tendrá GetItemCount declaración de la siguiente manera

    CREAR PROCEDIMIENTO GetItemCount @ID int, int @count salida

dentro, se puede utilizar

@count SELECT COUNT = (elemento) de la tblItem DONDE ID = @ID

  1. Para declarar una tabla antes de llamar al proceso y obtener ese valor como una columna.
1

Otra forma

DECLARE @Count table(counting INT) 
Insert into @Count 
EXEC GetItemCount 123 
SELECT Counting FROM @Count 
1

La solución (b) dada por el Sr. Mateo no funcionará cuando u llaman a esto en un (solución Por supuesto otro procedimiento almacenado (a) funciona perfectamente cuando usamos parámetro SALIDA) La alternancia para la solución (b) es la solución de Mr.Madhivanan. es decir, crea una tabla temporal y úsala y luego suéltala.

A continuación se presentan otras soluciones ..

no podemos obtener el valor de una cláusula de salida interna en un procedimiento almacenado directamente. Entonces, tenemos que usar el parámetro OUTPUT o VALOR DEVUELTO en su lugar.

Por favor, consulte las siguientes sugerencias:

SOLUCIÓN 1:

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) 
AS 


BEGIN 
DECLARE @MyTableVar Table(ProductID 
int) 


     INSERT Products 
     ( 
      pName 
    ) 
     OUTPUT Inserted.ProductID 
INTO @MyTableVar 
     VALUES 
     ( 
     @pName 
    ) 
RETURN (SELECT ProductID 
FROM @MyTableVar) 
END 


DECLARE @ProductID int 
EXEC @ProductID = [dbo].insertproduc 'TEST' 
SELECT @ProductID 

SOLUCIÓN: 2

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) , @pID int output 
AS 

BEGIN 
DECLARE @MyTableVar Table(ProductID int) 

     INSERT Products 
     (
      pName 
    ) 
     OUTPUT Inserted.ProductID INTO @MyTableVar 
     VALUES 
     (
     @pName 
    ) 
SELECT @pID=ProductID FROM @MyTableVar 
END 

DECLARE @ProductID int 
EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT 
SELECT @ProductID 
0

El siguiente no funcionará si no hay parámetros de entrada para el SP ejecutado:

EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT --works 
EXEC [dbo].insertproduc, @ProductID OUTPUT -- generates a parameter supplied when not needed error message if the insertproduc does not require parameters. 

mejor manera de utilizar el siguiente formato para todos los casos (que funciona en todas las versiones):

DECLARE @MyOutputVariable int 
EXEC @MyOutputVariable = [dbo].MyStoredProc 
Cuestiones relacionadas