Использовать выходной параметр хранимой процедуры - PullRequest
1 голос
/ 05 августа 2010
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 ]

5 голосов
/ 05 августа 2010

Для вызова этого sproc и получения выходного параметра вы делаете (например,):

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

Обновление:

Вам не нужно использовать RETURN - вы правы в том, что RETURN может вернуть только INTEGER. Но возвращаемое значение отличается от параметра OUTPUT, который вы фактически используете.

т.е. чтобы получить значение RETURN от sproc, используется другой синтаксис:

DECLARE @Result INTEGER
EXECUTE @Result = SomeSproc
2 голосов
/ 05 августа 2010

Хранимые процедуры не предназначены для "возврата значений" - вот для чего вы сохранили функции.

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)

и получите ДЕСЯТИЧНЫЙ (8,2) из ​​расчета.

Хранимые процедуры возвращают количество строк, на которые влияет их работа - INT.

Если вам нужно вернуть значение из сохраненного процесса, вам нужно использовать тип параметра OUTPUT и использовать технику, которую показывает AdaTheDev - вам нужно захватить выходное значение в переменную.

0 голосов
/ 05 августа 2010

Если ваш столбец 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

0 голосов
/ 05 августа 2010

Сначала вы можете использовать не хранимую процедуру с помощью функции, если вам нужно вернуть одно значение на основе входных параметров

Если ваш sp возвращает десятичное число, когда вам нужно целое число - просто приведите: SELECT (CAST @d AS INT), но это очень опасно (возможно переполнение типа)

...