2010-08-05 195 views
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 [email protected]_code and [email protected]_id and period_flg=2 and tax_flg=0) 

RETURN 
+6

什么是你的问题? – 2010-08-05 07:19:25

回答

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显示的技术 - 您需要将输出值转换为变量。

5

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

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

更新:

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

即得到一个存储过程返回值是不同的语法:

DECLARE @Result INTEGER 
EXECUTE @Result = SomeSproc 
+0

我需要返回十进制值。当输出值为intger时,使用return @p ...... 我该怎么做才能返回十进制值 – shmandor 2010-08-05 07:25:45

+1

@shmandor - 请参阅我的回答中的更新 – AdaTheDev 2010-08-05 08:43:46

0

首先,你可以通过一个功能,如果你要返回一个值基础上投入使用的不是一个存储过程参数

如果SP返回小数时,你需要整 - 只投:SELECT (CAST @d AS INT)但是这是非常危险的(可能的类型溢出)

+0

我需要返回十进制来自sp。的值可能是 – shmandor 2010-08-05 07:34:58

+1

@shmandor:你当前的sp有一个十进制输出参数。这不够吗? @ AdaTheDev的答案是关于如何正确使用它。 param被声明为十进制,变量被声明为十进制。无处 – abatishchev 2010-08-05 08:12:12

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

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