1
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  
4

4 回答 4

5

要调用该存储过程并检索输出参数,您可以执行以下操作(例如):

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

更新:

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

即从存储过程中获取返回值,是不同的语法:

DECLARE @Result INTEGER
EXECUTE @Result = SomeSproc
于 2010-08-05T07:19:29.657 回答
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 显示的技术 - 您需要将输出值抓取到一个变量中。

于 2010-08-05T07:42:58.083 回答
0

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

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

于 2010-08-05T07:30:00.497 回答
0

如果您的 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 内的输出参数,它将自动返回给调用者。

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

于 2010-08-05T07:51:20.673 回答