【问题标题】:How to use a value from one stored procedure in another?如何在另一个存储过程中使用一个值?
【发布时间】:2010-06-08 09:53:00
【问题描述】:

我在一个存储过程中有如下语句:

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

调用另一个存储过程,里面有以下语句:

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

但是,当我测试调用时,EXEC 会正确输出值,但它 未正确分配给@Count 参数。

我见过这样使用的示例或存储过程,包括这里,但没有一个使用了参数和返回值(我可以找到)。

ID 参数被传递到第二条语句,该语句返回第一个存储过程使用的计数值——我读过的所有信息似乎都表明这应该有效——但它并不总是 @Count 值零,即使GetItemCount 总是返回正确的值。

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

【问题讨论】:

  • 我能够让它工作 - 将输出作为参数是解决方案 - 不断忘记 SQL 不像我习惯的编程风格。

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


【解决方案1】:

在你的存储过程中,你是不是

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

【讨论】:

  • 谢谢你 - 它工作 - 不认为输出将是一个参数 - 这就是为什么我无法弄清楚我将显示输出视为输出,而实际上没有返回任何内容- 因此为什么当我读取值时它为零。
  • 自从我提出这个问题并回到这里并找到解决方案以来,已经搜索了几次这个问题,希望每次对我有帮助时都可以投票!
【解决方案2】:

另一种方式

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

【讨论】:

  • @MortezaFarhadi 它也将在 2008 年工作。你有什么错误吗?
【解决方案3】:

如果执行的 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】:

    您应该将@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
    

    【讨论】:

    • 这个例子也很有帮助,让我的查询正常工作,再次感谢。
    【解决方案5】:

    当您在另一个存储过程中调用它时,Matthew 先生给出的解决方案 (b) 将不起作用(当然,当我们使用 OUTPUT 参数时,解决方案 (a) 可以完美运行)。 解决方案 (b) 的替代方案是 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
    

    【讨论】:

      【解决方案6】:

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

      1. GetItemCount 中将另一个参数@count 声明为OUTPUT。所以你会有GetItemCount声明如下:

         CREATE PROCEDURE GetItemCount @ID int, @count int OUTPUT
        

        在里面,可以使用

         SELECT @count = COUNT(Item) 
         FROM tblItem 
         WHERE ID = @ID
        
      2. 在调用过程之前声明一个表并将该值作为列获取。

      【讨论】:

        【解决方案7】:

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

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

        我的存储过程:

        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),也可以使用任何变量,但这将设置您的输出参数,而不会像返回的那样返回任何返回数据:

        方法一:

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

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

        方法二:

        插入临时表

        @DECLARE @TableTemp TABLE
                            (
                                Column1 VARCHAR(20),
                                Column2 VARCHAR(20)
                            )
        
        INSERT INTO @TableTemp
            EXEC MyStoredProcedure 'InParam1', 'InParam2', @returnParam1 OUT, @returnParam2 OUT
        

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

        方法三:

        要简单地将返回的值用作表格数据,我们可以这样使用:

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

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

        【讨论】:

          【解决方案8】:

          你也可以根据Madhivanan的这个答案试试这个:

          DECLARE @tblItem table(Item INT)
          DECLARE @Count INT
          
          Insert into @tblItem 
          EXEC GetItemCount 123 
          SELECT @Count = Item FROM @tblItem 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-14
            • 1970-01-01
            • 2014-06-05
            • 2011-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多