2013-05-16 32 views
0

我的SQL Server 2008這樣的存儲過程:SQL服務器 - 檢查輸入參數爲空或零

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

現在我想改變這一行爲,如果由於@someval0,一個NULL存儲在some_column否則就表現得它現在正在做的方式。 所以我要尋找類似:

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

我沒有創建一個varchar @sql變量,並調用sq_executesql就可以了(至少這是我想做的最後一件事)的選項。有關如何去做這件事的任何建議?

回答

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 
+0

感謝。這很快且非常有幫助。 – user467947

+0

@ user467947 - 任何時候都歡迎您:) –

+0

除了這段代碼根本不會做同樣的工作 - 如果@ someval不是'0'或'NULL',這會將some_column設置爲NULL (你是否打算在你的CASE表達式中有ELSE @ someval?) –

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 
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