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
答案 0 :(得分:5)
要调用该sproc并检索输出参数,您可以(例如):
DECLARE @p DECIMAL(8,2)
EXECUTE dbo.StoredProcedure8 123, 456, @p OUTPUT
-- @p now contains the output value
<强>更新强>
您不需要使用RETURN
- 您是对的,RETURN
只能返回INTEGER。但是返回值与OUTPUT参数不同,这是您实际使用的参数。
即。从sproc获取RETURN值是不同的语法:
DECLARE @Result INTEGER
EXECUTE @Result = SomeSproc
答案 1 :(得分: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显示的技术 - 您需要将输出值获取到变量中。
答案 2 :(得分:0)
首先,如果必须根据输入参数返回单个值,则不能使用函数的存储过程
如果你的sp在需要整数时返回十进制 - 只需转换:SELECT (CAST @d AS INT)
但这非常危险(可能的类型溢出)
答案 3 :(得分:0)
如果您的列tran_value是十进制类型,则运行查询后@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也是正确的