存储过程中的默认空值不是Null

时间:2010-12-01 09:27:58

标签: sql sql-server stored-procedures null default

我一直在测试一个错误的过程,我意识到问题是传入的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 - ""

我假设Null值默认为存储过程参数中赋值的值,但是这表明它是否作为参数存在,它采用您传入的值。是否有SQL服务器中的设置可以更改此值行为?

3 个答案:

答案 0 :(得分:4)

不,空值未设置为默认值,因为null本身是SQL中变量或字段的有效值。

要确保参数获取其默认值,请不要传入参数。所以对于你的过程:

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

答案 1 :(得分:3)

仅在省略过程调用中的参数时分配的默认值。您可以测试过程中参数是否为空,并为其指定所需的默认值。

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

答案 2 :(得分:2)

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

所以你说的是

(@myVar varchar(MAX) = '')

表示当你没有传入一个参数时,你会在@myVar中得到一个空字符串,这反过来意味着当你说

Where @myVar Is Null
只有在显式传入null参数时,

才会计算为true,就像在第一个测试用例中一样。