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

如果参数@somevalNULL,则此 SP 将仅使用 中的现有值some_column

现在我想改变这种行为,如果 is 的值@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

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
于 2013-05-16T06:08:19.457 回答
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
于 2013-05-16T06:09:13.203 回答
0

我认为这是一个非常糟糕的主意 - 我建议如果有人想要存储 a 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 回答