2010-12-01 255 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'