Это, но очевидно, что сервер MS SQL поддерживает теорию короткого замыкания, чтобы улучшить производительность, избегая ненужной проверки,
Поддерживающие Пример:
SELECT 'TEST'
WHERE 1 = 'A'
SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'
Здесь первый пример приведет к ошибке ' Ошибка конверсии при преобразовании значения varchar 'A' в тип данных int.'
В то время как второе выполняется легко, так как условие 1 = 1 оценивается как ИСТИНА, и, следовательно, второе условие не работает вообще.
Дальше больше
SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'
здесь первое условие будет вычисляться ложным и, следовательно, СУБД будет идти второе условие и снова вы получите сообщение об ошибке преобразования, как в приведенном выше примере.
ПРИМЕЧАНИЕ: Я НАПИСАЛ ошибочные УСЛОВИЯ JUST ПРОВЕСТИ ПОГОДУ УСЛОВИЕ Выполнено ИЛИ короткозамкнутый ЕСЛИ РЕЗУЛЬТАТЫ ЗАПРОСА В ОШИБКАХ означают состояние казнено, короткозамкнутая ИНАЧЕ.
SIMPLE ОБЪЯСНЕНИЕ
Рассмотрим,
WHERE 1 = 1 OR 2 = 2
как первое условие получения оценивается в ИСТИНА, его бессмысленно оценивать второе условие, поскольку его оценка в любое значение не влияет на результат вообще-то, поэтому его хорошая возможность для Sql-сервера сохранить время выполнения запроса, пропуская ненужную проверку состояния или оценку.
в случае «ИЛИ», если первое условие оценивается в ИСТИНА всю цепочку, связанную с «ИЛИ» бы рассматривать как оценивали с истинным без оценки других.
condition1 OR condition2 OR ..... OR conditionN
Если условие 1 оценивается как истинное, оставим все условия до тех пор, пока условиеN не будет пропущено. В обобщенных словах при определении первых TRUE, все другие условия, связанные с ИЛИ, будут пропущены.
Рассмотрим второе условие
WHERE 1 = 0 AND 1 = 1
как первое условие становится evalutated к FALSE его бессмысленно оценивать второе условие, поскольку его оценка в любое значение не влияет на результат на всех, так что опять его хорошая возможность для Sql Server сохранить время выполнения запроса, пропуская ненужную проверку состояния или оценку.
в случае «И», если первое условие вычисляется в FALSE всю цепочку, связанную с «И» бы рассматривать как оценивали ЛОЖЬ без оценки других.
condition1 AND condition2 AND ..... conditionN
если condition1 оценивается в FALSE, остальное все условия до conditionN будет пропущен. В обобщенных словах при определении первых FALSE, все другие условия, связанные И будут пропущены.
НИХ, мудрая программист должны ВСЕГДА ПРОГРАММИРОВАТЬ цепи УСЛОВИЙ таким образом, что, менее дорогой или большинство Исключив УСЛОВИЕ получает оценку ПЕРВОГО, ИЛИ ARRANGE состояние, в таким образом, что может занять максимальную пользу от короткого замыкания
Не является ли пункт @key НЕ НУЛЛ избыточным? Предложение @key IS NULL на LHS позаботится об этом нет? – spender
@splender - зависит от ответа на вопрос –
@Greg: Я согласен с spender. Я не вижу недостатка или наличия короткого замыкания, что имеет значение. Если @key IS NULL, то @key = t.Key всегда будет возвращать false, как NULL! = NULL (именно поэтому мы используем IS NULL, в конце концов). –