2012-11-16 34 views
4

我有一個從.aspx.cs頁面調用的存儲過程。我有一個參數,有時在調用存儲過程時無法發送。因此,我正在做以下事情:T SQL - null變量

IF @variable is null 
    BEGIN 
     ...do this... 
    END 
Else 
     ...do that... 

我的問題是在IF語句中。至於我可以告訴我的時候使用任何如下:

  • if @parameterVariable = null
  • if @parameterVariable = ''
  • if @parameterVariable <= 0

什麼也沒有發生!?當我在SSMS中調試存儲過程時,我發現(即使該參數爲空(無用戶選擇)),光標前往並在ELSE語句中運行代碼。難道我做錯了什麼?

謝謝!

+0

值是'@ parameterVariable'實際上'null'? – asawyer

+0

我正在使用'Declare @ variable'和'set @variable = null'通常情況下,參數將包含一個值。但是,我發現並正在糾正用戶不選擇並且未定義參數時要管理的sproc。 –

+1

你可能在其他地方有問題,這工作正常。請參閱:http://sqlfiddle.com/#!3/d41d8/6290 – asawyer

回答

3

if @parameterVariable = null是錯誤的。 將其更改爲if @parameterVariable IS NULL

下面是一個SQL小提琴證明這一點:http://www.sqlfiddle.com/#!6/6cb42/1

+1

多米尼克我添加了一個SQL小提琴作爲例子 –

4

使用可選的參數:

CREATE PROCEDURE uspTest 
    @param1 varchar(50) = null, 

AS 
    BEGIN 
     SELECT col1, col2 
     FROM Table1 
     WHERE 
       ((@Param1 IS NULL) OR (col1 = @Param1)) 
    END 
+0

這適用於其他場景,毫無疑問......並且非常感謝ElenaDBA ...但是(((@Param1 IS NULL)是導致我需要處理整個程序的其餘部分的確切問題if if else –

1

在SMSS調試時,你必須檢查,說:「傳遞空值」框。否則你的值是一個空字符串或somesuch。

我使用你一直建議的模式,它對我很好。

+0

我在哪裏可以找到「通過空值」複選框? –

+0

右鍵單擊存儲過程,然後選擇「執行存儲程序',並填寫你想要的參數 –

+0

這是一個偉大的工具。謝謝,仍然是故障排除,不知道這是我所需要的(yehers我還是noob) –

1

我建議你閱讀本頁面=>ANSI NULLS

其實if @var = null是沒有錯的,一切都取決於ANSI_NULLS :)

+0

'當SET ANSI_NULLS爲OFF時,Equals (=)和Not Equal To(<>)比較運算符不遵循ISO標準。使用WHERE column_name = NULL的SELECT語句將返回column_name中具有空值的行。 WHERE column_name <> NULL返回列中具有非空值的行。此外,使用WHERE column_name <> XYZ_value的SELECT語句將返回非XYZ_value且不爲NULL的所有行。「我認爲這適用於」錯誤「。但是,真的,每個人都有自己的! –

+0

如果這是「錯誤」,他們爲什麼要放置ANSI_NULLS選項? – fnurglewitz

+0

這就是爲什麼我使用報價。我絕不會做出道德判斷。但我認爲應儘可能使用ANSI SQL。僅僅因爲它在那裏並不意味着它是「好」的。 –