0

次のようなSQL Server 2008のストアドプロシージャがあります。

create procedure test_proc
@someval int,
@id int
as
update some_table
set some_column = ISNULL(@someval, some_column)
where id = @id
go

パラメータ@somevalがの場合NULL、この SP は の既存の値をそのまま使用しますsome_column

ここで、この動作を変更して、 の値が の場合@someval0aNULLが格納されるsome_columnようにします。それ以外の場合は、現在と同じように動作します。だから私は次のようなものを探しています:

if @someval == 0
set some_column = NULL
else
set some_column = ISNULL(@someval, some_column)

varchar @sql 変数を作成して sq_executesql を呼び出すオプションはありません (少なくとも、これは私がやりたい最後のことです)。これを行う方法について何か提案はありますか?

4

3 に答える 3

0

私はそれは本当に悪い考えだと思います-誰かが を保存したい場合、それを実現するために他の魔法の値を渡す必要はNULL本当にあるべきではないことをお勧めします。ただし、それを行う方法を示しましょう。

update some_table
set some_column = CASE WHEN @someVal = 0 THEN NULL ELSE ISNULL(@someval, some_column) END
where id = @id

もちろん、質問のストアド プロシージャの単純さを考えると、変更したくない場合はストアド プロシージャを呼び出さsome_columnないことで問題全体を解決できます。あなたの実際の手順はもっと複雑だと思います。代わりに、私がすることは次のとおりです。

create procedure test_proc
@someval int,
@someval_specified bit,
@id int
as
update some_table
set some_column = CASE WHEN @someval_specified = 1 THEN @someval ELSE some_column END
where id = @id

そして今、NULL手段NULL0手段0など。

于 2013-05-16T06:10:42.387 に答える