Нулевые значения по умолчанию в хранимых процедурах не являются Нуль - PullRequest
0 голосов
/ 01 декабря 2010

Я тестировал неисправную процедуру и понял, что проблема в том, что передаваемые значения 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 ]

4 голосов
/ 01 декабря 2010

Нет, значения NULL не установлены по умолчанию, так как NULL само по себе является допустимым значением для переменной или поля в SQL.

Чтобы параметр получил значение по умолчанию, не передавайте параметр вообще. Итак, для вашего процесса:

-- @myVar will get default
EXEC TestVarcharMaxIsNull 
-- @myVar will be null
EXEC TestVarcharMaxIsNull @myVar=NULL
-- @myVar will be "Hello"
EXEC TestVarcharMaxIsNull @myVar='Hello'
3 голосов
/ 01 декабря 2010

Значения по умолчанию присваиваются только тогда, когда вы опускаете параметр в вызове процедуры.Вы можете проверить, является ли параметр пустым в процедуре, и присвоить ему желаемое значение по умолчанию.

declare @var varchar(MAX)
select @var = ISNULL(@myVAR, '')
2 голосов
/ 01 декабря 2010

Пустая строка '' не эквивалентна нулевому значению.

Так, где вы говорите

(@myVar varchar(MAX) = '')

означает, что если вы не передадите аргумент, вы получите пустую строку в @myVar, что, в свою очередь, означает, что когда вы говорите

Where @myVar Is Null

будет иметь значение true, только если вы явно передадите пустой аргумент, как в первом тестовом примере.

...