【问题标题】:Use stored procedure output parameter使用存储过程输出参数
【发布时间】:2010-08-05 07:16:20
【问题描述】:
ALTER PROCEDURE dbo.StoredProcedure8
@emp_code bigint,
@co_id bigint,
@p decimal(8,2) output

AS

SELECT @p = (select sum(tran_value) from emp_ded_ben_trans where emp_code=@emp_code and co_id=@co_id and period_flg=2 and tax_flg=0)

RETURN  

【问题讨论】:

  • 你有什么问题?

标签: sql sql-server-2005 tsql stored-procedures output-parameter


【解决方案1】:

要调用该存储过程并检索输出参数,您可以这样做(例如):

DECLARE @p DECIMAL(8,2)
EXECUTE dbo.StoredProcedure8 123, 456, @p OUTPUT
-- @p now contains the output value

更新:

你不需要使用RETURN - 你是对的,RETURN 只能返回一个整数。但是返回值与您实际使用的 OUTPUT 参数不同。

即从 sproc 中获取 RETURN 值是不同的语法:

DECLARE @Result INTEGER
EXECUTE @Result = SomeSproc

【讨论】:

  • 我需要返回十进制值。使用return @p时这个输出值是整数......我该怎么做才能返回十进制值
【解决方案2】:

存储过程不是为了“返回值”——这就是你存储函数的目的。

CREATE FUNCTION dbo.CalculateSomething
  (@emp_code bigint, @co_id bigint)
RETURNS DECIMAL(8, 2)
AS BEGIN    
    RETURN
      (SELECT SUM(tran_value) 
       FROM dbo.emp_ded_ben_trans 
       WHERE 
          emp_code = @emp_code AND co_id = @co_id  
          AND period_flg = 2  AND tax_flg = 0)
END

然后你可以像这样调用这个存储的函数:

SELECT dbo.CalculateSomething(value_for_emp_code, value_for_co_id)

并从计算中取回 DECIMAL(8,2)。

存储过程将返回受其操作影响的行数 - 一个 INT。

如果您需要从存储过程中返回值,则需要使用 OUTPUT 参数类型并使用 AdaTheDev 显示的技术 - 您需要将输出值抓取到变量中。

【讨论】:

    【解决方案3】:

    首先,如果必须根据输入参数返回单个值,则不能通过函数使用存储过程

    如果您的 sp 在需要整数时返回小数 - 只需强制转换:SELECT (CAST @d AS INT) 但这非常危险(可能类型溢出)

    【讨论】:

    • 我需要从 sp 返回十进制值。这可能吗
    • @shmandor:你当前的 sp 有一个十进制输出参数。还不够吗? @AdaTheDev 的答案是关于如何正确使用它。参数声明为十进制,变量声明为十进制。无处可寻
    【解决方案4】:

    如果您的 Column tran_value 是 Decimal 类型,则 @p 在您运行查询后将具有十进制值...

    Create Table #test
    (ID1 Int,
    ID2 Decimal(8,2)
    )
    
    Insert into #test Values (1,1.1)
    Insert into #test Values (2,2.2)
    Insert into #test Values (3,3.3)
    
    Declare @p Decimal(8,2), @intp int
    
    Select @intp = Sum(ID1), @p = Sum(ID2) from #test
    
    Select @intp as IntegerSum, @p as DecimalSum
    
    Drop Table #test
    

    输出

    IntegerSum  DecimalSum
    ----------- ---------------------------------------
    6           6.60
    

    注意:您不需要做任何特定的事情来通过输出参数从存储过程中返回值...只需将值分配给您的 SP 中的输出参数,它将自动返回给调用者。

    这意味着即使没有返回语句,您的 SP 也是正确的

    【讨论】:

      猜你喜欢
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多