如何在另一个存储过程(SQL)中使用一个存储过程中的变量

时间:2018-09-06 10:56:19

标签: sql sql-server

我编写了一个存储过程,如下所示(这是一个简化的版本-SP做了很多其他事情,但是这些是关键部分):

CREATE PROCEDURE [dbo].[_uspCustomSP]

AS
BEGIN

CREATE TABLE #custno(custno int) 
INSERT INTO #custno
EXEC    usp_GetCustomerNo


DECLARE @custnumber nvarchar(5)  
SET @custnumber = (SELECT custno FROM #custno)  

DROP TABLE #custno-- drop table so fresh each time

END

此SP可以按我的意愿工作。但是,我希望能够在其他存储过程中引用@custnumber的值。有什么方法可以保留@custnumber的值,但又不重新运行usp_GetCustomerNo(因为每次运行时,@ custnumber的值都会改变-我希望能够使用存储在变量中的确切数字。)

编辑:我在下面提出了一个非常有用的建议,建议我包括一个输出参数。我已经考虑过了,但是我不确定如何在不重新运行整个SP的情况下在其他地方(在另一个SP中)引用此输出。

很抱歉,如果我没有提供足够的信息。

非常感谢, 海伦

1 个答案:

答案 0 :(得分:2)

您可以让存储过程返回值:

CREATE PROCEDURE [dbo].[_uspCustomSP] (
    @custnumber nvarchar(5) OUTPUT
) AS
BEGIN

    CREATE TABLE #custno(custno int) ;

    INSERT INTO #custno (custno)        
        EXEC usp_GetCustomerNo;

    SELECT  @custnumber = custno FROM #custno ; 

    DROP TABLE #custno-- drop table so fresh each time
END;

话虽如此,我对存储过程有一些评论:

  • 无需删除临时表。我更喜欢表变量,因为很明显它们超出了范围。
  • 我认为在表中返回单个值很危险。为什么不对OUTPUT使用标量函数或usp_GetCustomerNo参数?
  • 您应该养成将分号放在语句末尾的习惯,并始终将列列表与INSERT一起使用。

您将调用存储过程为:

声明@custnumber nvarchar(5);

exec sp_executesql _uspCustomSP,
                   N'@custnumber nvarchar(5) output',
                   @custnumber=@custnumber output;