如何使用另一个存储过程中的值?

时间:2010-06-08 09:53:00

标签: sql sql-server-2008 stored-procedures return-value parameters

我在存储过程中有以下声明:

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

使用以下语句调用另一个存储过程:

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

然而,当我测试呼叫时,EXEC正确输出值但是它 未正确分配给@Count变量。 我见过这样的例子或存储过程,包括这里,但没有一个参数和使用的返回值(我可以找到)。 ID参数被传递到第二个语句,该语句返回第一个StoredProcedure使用的计数值 - 我读过的所有信息似乎表明这应该有效 - 但即使GetItemCount,@ Count值也不会为零。始终返回正确的值。

如果有帮助的话,这是在Microsoft SQL Server 2008中。

8 个答案:

答案 0 :(得分:25)

在您的存储过程中,您要么是

a)将计数值分配给输出参数:

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

称为:

DECLARE @count INT
EXEC GetItemCount 123, @count OUTPUT

或,b)将计数值指定为返回值:

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

  RETURN @count
END  

称为:

DECLARE @count INT
EXEC @count = GetItemCount 123

答案 1 :(得分:3)

另一种方式

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

答案 2 :(得分:2)

您应该将@Count作为输出参数传递。

Create Proc dbo.usp_Proc1

@Id int,
@Count int output

as begin

select @Count = Count(Item) from tblItem where id=@Id

end
Go

Declare @Count int
Declare @Id int

Set @Id = 1

Exec dbo.usp_Proc1 @Id, @Count output

select @Count

答案 3 :(得分:2)

如果执行的SP没有输入参数,则以下内容不起作用:

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.

最好在所有情况下使用以下格式(适用于所有版本):

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

答案 4 :(得分:1)

当你在另一个存储过程中调用它时,Matthew先生给出的解决方案(b)将不起作用(当我们使用OUTPUT参数时,Ofcourse解决方案(a)完美地工作)。 解决方案(b)的替代是Mr.Madhivanan的解决方案。即,创建一个临时表并使用它然后删除它。

以下是其他解决方案..

我们无法直接从存储过程中的内部OUTPUT子句获取值。 所以我们必须使用OUTPUT参数或RETURN VALUE。

请参阅以下建议:

解决方案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 

<强>解: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

答案 5 :(得分:0)

您在变量@Count中捕获的是存储过程GetItemCount的执行状态,而不是您期望的值。要捕获该值,您有两种方法。

  1. 在GetItemCount中将另一个参数@count声明为OUTPUT。因此,您将获得如下的GetItemCount声明

    CREATE PROCEDURE GetItemCount @ID int,@ count int output

  2. 在里面,你可以使用

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

    1. 在调用proc并将该值作为列声明之前声明一个表。

答案 6 :(得分:0)

阅读所有答案后将其简化。使用了两个输入和两个输出参数。

确保在存储过程中为输出参数分配了一些值。

我的存储过程:

CREATE PROCEDURE [dbo].[MyStoredProcedure]
    (@InParam1  VARCHAR(20) = NULL,
     @InParam2  VARCHAR(20) = '',
     @OutParam1 VARCHAR(20) = NULL OUT,
     @OutParam2 VARCHAR(20) = NULL OUT)
AS
BEGIN
    SET @OutParam1 = 'Whatever you want to return'
    SET @OutParam2 = 'Whatever you want to return'
    RETURN 0; --This is final value any SP returns by default 0
END

调用此存储过程-我使用了两个输出参数,因此我们需要在执行存储过程之前对其进行声明:

DECLARE @OutParam1 VARCHAR(20)
DECLARE @OutParam2 VARCHAR(20)

即使您最终不需要使用存储过程,也可以使用任何变量(例如@Var),但这将设置输出参数而不会像返回一样返回任何数据:

方法1:

DECLARE @Var INT
EXEC @Var = MyStoredProcedure 'InParam1', 'InParam2', @OutParam1 OUT, @OutParam2 OUT

如果要从存储过程中返回一些select语句,并希望使用这些值,则可以将它们保存在临时表中,也可以仅用作选择查询。

方法2:

插入临时表

@DECLARE @TableTemp TABLE
                    (
                        Column1 VARCHAR(20),
                        Column2 VARCHAR(20)
                    )

INSERT INTO @TableTemp
    EXEC MyStoredProcedure 'InParam1', 'InParam2', @returnParam1 OUT, @returnParam2 OUT

这将设置MyStoredProcedure的两个输出参数,并插入从MyStoredProcedure传递的值作为选择语句。

方法3:

要简单地将返回值用作表数据,我们可以使用以下方法:

EXEC MyStoredProcedure 'InParam1', 'Inparam2', @returnParam1 OUT, @returnParam2 OUT

在以上所有情况下,始终会设置输出参数。

答案 7 :(得分:0)

您也可以根据Madhivanan的答案尝试以下操作:

DECLARE @tblItem table(Item INT)
DECLARE @Count INT

Insert into @tblItem 
EXEC GetItemCount 123 
SELECT @Count = Item FROM @tblItem