2015-02-17 2 views
-1

Я работаю в SQL Server 2008. Мой текущий скрипт имеет SET ANSI_NULLS ON (т. Е. Если сравнение работает с выражением NULL, то сравнение возвращает UNKNOWN, а не TRUE или FALSE) , Выполняет ли оператор IF выполнение пакета T-SQL, следующего за ним, только когда оператор IF возвращает TRUE? Или, может ли он выполняться, когда оператор IF возвращает UNKNOWN?результат инструкции IF для NULL

В качестве теста случае, я пытаюсь определить, что происходит в следующем IF заявлении:

IF CONVERT(varchar(10), @some_date, 101) = '01/01/1900' 
do things 

Насколько я знаю, «делать вещи» будет выполнять, только если данная IF оператор возвращает значение TRUE , Итак, в качестве примера, если @some_date = '01/01/1901 ', то оператор IF возвращает FALSE, что означает, что «делать вещи» не будет выполняться. В качестве другого примера, если @some_date имеет значение NULL, CONVERT также возвращает NULL (я думаю), что означает, что NULL будет (будет пытаться) сравниваться с '01/01/1900 ', что означает, что оператор IF возвратит UNKNOWN (потому что ANSI_NULLS включен). Поскольку UNKNOWN не является TRUE, тогда «делать вещи» не будет выполняться. Насколько я понимаю это правильно?

+0

Сравнение (NULL = anything) всегда неверно. – Jeremy

+0

Есть ли вопрос, стоящий за этим вопросом? потому что пока это вопрос, на который вы можете ответить, проверив его самостоятельно. –

+0

Да, в этом контексте значение null считается ложным. – shawnt00

ответ

0

Используйте функцию coalesce(), чтобы заменить NULL на известное значение.

Кроме того, поскольку ваше значение уже является датой, вы лучше обрабатываете константу 1/1/1900 в качестве даты, чем конвертируете @some_value в строку.

--assuming @some_date is actually a datetime, and you only want to compare the date portion 
If coalesce(cast(@some_date as date), '1900-01-01') = '1900-01-01' 
Begin 
    -- do something 
End 

Кроме того, вы можете проверить это самостоятельно. Посмотрите на следующий код:

--set ansi_nulls off 
declare @some_date datetime; 

--set @some_date = '01/01/1900' 

If convert(varchar(10), @some_date, 101) = '01/01/1900' 
    print 'True' 

Попробуйте в среде SQL Server Management Studio, с и без комментировал линий, и наблюдать результаты.

+0

Я не хочу менять код. Я просто пытаюсь определить, что происходит, когда @some_date имеет значение NULL. – user3100444

+0

Может быть, вы и должны быть. Или, по-другому, если бы вы только хотели узнать, что происходит, почему бы просто не запустить тест через студию управления? –

+0

Я пробовал это в SSMS. Изменение ANSI_NULLS не влияет на @some_date равным NULL или '01/01/1900 '. Это должно означать, что T-SQL после оператора IF выполняется только тогда, когда IF возвращает TRUE. – user3100444

Смежные вопросы