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 に答える
その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
ストアド プロシージャは「値を返す」ようには作成されていません。これが関数を格納した理由です。
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 が示す手法を使用する必要があります。出力値を変数に取り込む必要があります。
まず、入力パラメーターに基づいて単一の値を返す必要がある場合は、関数によってストアド プロシージャを使用できません。
整数が必要なときにspが小数を返す場合-キャストするだけです:SELECT (CAST @d AS INT)
しかし、これは非常に危険です(型オーバーフローの可能性があります)
列 tran_value が 10 進数タイプの場合、クエリを実行した後、@p は 10 進数値になります...
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 が正しいことを意味します