SQL Server - 检查输入参数是否为零

时间:2013-05-16 06:04:54

标签: sql sql-server sql-server-2008

我有一个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

如果参数@somevalNULL,则此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(至少这是我想做的最后一件事)。关于如何做到这一点的任何建议?

3 个答案:

答案 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表示NULL0表示0等。