我一直在测试一个错误的过程,我意识到问题是传入的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服务器中的设置可以更改此值行为?
答案 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,就像在第一个测试用例中一样。