2010-12-01 113 views
0

我一直在測試出現故障的過程中,我意識到這個問題是在不被拖欠的程序價值傳遞Null值...默認爲空值不爲空

Create Procedure TestVarcharMaxIsNull 
(@myVar varchar(MAX) = '') 
as 
Select 'Hello' Where @myVar Is Null 
Go 
Exec TestVarcharMaxIsNull Null 
Go 
Exec TestVarcharMaxIsNull '' 
Go 
Exec TestVarcharMaxIsNull 
Go 
Drop Procedure TestVarcharMaxIsNull 

輸出

Run 1 - "hello" 
Run 2 - "" 
Run 3 - "" 

我認爲空值默認爲值在存儲過程中參數被分配到,但是這表明如果它存在,因爲它需要你在傳遞值的參數。有沒有在SQL設置可以改變這種行爲的服務器?

回答

2

空字符串''不等於空值。

那麼,你說

(@myVar varchar(MAX) = '') 

意味着,當你沒有一個參數傳遞你會得到@myvar,這反過來又意味着,當你說一個空字符串

Where @myVar Is Null 

只有在顯式傳入null參數時纔會計算爲true,如在第一個測試用例中那樣。

3

僅當您從過程調用中省略參數時纔會分配的默認值。您可以測試該過程中的參數是否爲空,並將其分配爲所需的默認值。

declare @var varchar(MAX) 
select @var = ISNULL(@myVAR, '') 
4

不,空值未設置爲默認值,因爲null本身就是SQL中變量或字段的有效值。

爲確保參數獲取其默認值,請不要傳入參數。所以對於你的proc:

-- @myVar will get default 
EXEC TestVarcharMaxIsNull 
-- @myVar will be null 
EXEC TestVarcharMaxIsNull @myVar=NULL 
-- @myVar will be "Hello" 
EXEC TestVarcharMaxIsNull @myVar='Hello'