我有一个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
中的现有值。
现在我想更改此行为,如果@someval
的值为0
,则NULL
中会存储some_column
,否则它的行为就像它在做的那样现在。
所以我正在寻找类似的东西:
if @someval == 0
set some_column = NULL
else
set some_column = ISNULL(@someval, some_column)
我没有选择创建varchar @sql变量并在其上调用sq_executesql(至少这是我想做的最后一件事)。关于如何做到这一点的任何建议?
答案 0 :(得分:3)
您可以使用CASE
表达式执行此操作。像这样:
update some_table
set some_column = CASE WHEN @someval = 0 THEN NULL
WHEN @someval IS NULL THEN somcolumn
ELSE @someval -- the default is null if you didn't
-- specified one
END
where id = @id
答案 1 :(得分:1)
这样的事情?
create procedure test_proc
@someval int,
@id int
as
update some_table
set some_column = CASE
WHEN @someval = 0 THEN NULL
ELSE ISNULL(@someval, some_column) END
where id = @id
go
答案 2 :(得分: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
表示NULL
,0
表示0
等。