2017-05-24 4 views
0

テーブルからintを取り出してテーブルを更新する単純なストアドプロシージャがある。
これは完全なストアドプロシージャ別のSPの中からSPを呼び出すと異なる結果が出る

create procedure spGetNewVMacsBatchNumber as 
begin 
    set nocount on 
    declare @LastUsedVMacsBatchNumber int 

    update tblSettings with (TABLOCK) 
    set LastUsedVMacsBatchNumber = isnull(LastUsedVMacsBatchNumber, 0) + 1, 
      @LastUsedVMacsBatchNumber = isnull(LastUsedVMacsBatchNumber, 0) + 1 

    select @LastUsedVMacsBatchNumber 
end; 

私はSSMSからこれを実行すると、それが数+ 1を返し、テーブルを更新し、私はそれに期待しています。
私はこのようなSSMSでそれを呼び出す:私はそれは私が期待した値を返しますが、常にゼロを返していない別のストアドプロシージャ内からそれを呼び出すとき

declare @BatchNumber int 
exec @BatchNumber = spGetNewVMacsBatchNumber 

しかし。他のストアドプロシージャの呼び出しは上記とまったく同じです。

私はこのストアドプロシージャを別のストアドプロシージャから呼び出すことはできますが、それでも私が期待する値を得ることができますか?

spGetNewVMacsBatchNumberのアイデアは、現在の値+ 1を取得し、2つのプロセスが同時にそれを実行するときに間違った値を返さないようにすることです。
おそらく私のアプローチでそれを行うより良い方法がありますか?

+1

あなたは 'update'で' output'節を使っていると考えましたか? –

答えて

3

実際には、手順としてoutput parametersを使用する必要があります。

alter procedure spGetNewVMacsBatchNumber @ReturnVal int output as 
begin 
    set nocount on 
    declare @LastUsedVMacsBatchNumber int 

    update tblSettings with (TABLOCK) 
    set LastUsedVMacsBatchNumber = isnull(LastUsedVMacsBatchNumber, 0) + 1, 
      @LastUsedVMacsBatchNumber = isnull(LastUsedVMacsBatchNumber, 0) + 1 

    select @ReturnVal = @LastUsedVMacsBatchNumber 
end; 

そして、このようにそれを呼び出す:

declare @BatchNumber int 
exec spGetNewVMacsBatchNumber @ReturnVal= @BatchNumber output; 
select @BatchNumber 

あなたは、実際の「戻り値」は、ストアドプロシージャから、そのようなspGetNewVMacsBatchNumberストアドプロシージャのreturn statusではなくなっています。

+0

ありがとうございます。私はいつもストアドプロシージャが最後のselectステートメントを返すと考えました。私は間違っていたと思う – GuidoG

関連する問題