Почему? 1 = 1 и @id = 'x' истинно.
Ответ 3
Очевидно, что сервер 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'
здесь первое условие будет оцениваться как ложное, и, следовательно, СУБД пойдет на второе условие и снова вы получите ошибку преобразования, как в приведенном выше примере.
ПРИМЕЧАНИЕ. Я РАЗРУШАЮЩИЙ УСЛОВИЕ ТОЛЬКО ДЛЯ РЕАЛИЗИРОВАНИЯ ПОГОДЫ СОСТОЯНИЕ ВЫПОЛНИТСЯ ИЛИ КРАТКОСРОЧНО
ЕСЛИ РЕЗУЛЬТАТЫ QUERY В ОШИБКЕ СОХРАНЯЮТ СОСТОЯНИЕ, ВЫПОЛНЕННОЕ, КОРОТКО-ЦИРКУЛИРОВАННОЕ ИНОЕ.
ПРОСТОЕ ОБЪЯСНЕНИЕ
Рассмотрим,
WHERE 1 = 1 OR 2 = 2
поскольку первое условие оценивается как TRUE, его бессмысленно оценивать второе условие, потому что его оценка в любом значении
не повлияет на результат вообще, поэтому его хорошая возможность для Sql Server сохранить время выполнения запроса, пропустив ненужную проверку состояния или оценку.
в случае "ИЛИ" , если первое условие оценивается как ИСТИНА, вся цепочка, связанная "ИЛИ" , считается оцененной как true, не оценивая других.
condition1 OR condition2 OR ..... OR conditionN
если условие 1 оценивается как истинное, оставим все условия до тех пор, пока условие N не будет пропущено.
В обобщенных словах при определении первого TRUE все остальные условия, связанные с OR, будут пропущены.
Рассмотрим второе условие
WHERE 1 = 0 AND 1 = 1
поскольку первое условие получает evalutated до FALSE его бессмысленно оценивать второе условие, потому что его оценка в любом значении
не повлияет на результат вообще, поэтому снова его хорошая возможность для Sql Server сохранить время выполнения запроса, пропустив ненужную проверку состояния или оценку.
в случае "И" , если первое условие оценивается как ЛОЖЬ, вся цепочка, связанная с "И" , считается оцененной к FALSE без оценки других.
condition1 AND condition2 AND ..... conditionN
если условие 1 оценивается как FALSE, остальные условия сохраняются до тех пор, пока условиеN не будет пропущено.
В обобщенных словах при определении первого FALSE все остальные условия, связанные с И, будут пропущены.
ПОЭТОМУ, ПРОСТРАНСТВУЮЩИЙ ПРОГРАММА ДОЛЖНА ВСЕГДА ПРОГРАММА СЕТИ УСЛОВИЙ В ТАКОЙ ПУТЬ, ЧТО, МЕНЕЕ РАСПРОСТРАНЕННОЕ ИЛИ НАИБОЛЕЕ ЛИКВИДАЦИОННОЕ СОСТОЯНИЕ ПОЛУЧАЕТ ОЦЕНКУ ПЕРВОГО,
ИЛИ СОХРАНЯЙТЕ СОСТОЯНИЕ В ТАКОЙ ПУТЕМ, КОТОРЫЙ МОЖЕТ ПРИНЯТЬ МАКСИМАЛЬНОЕ ПРЕИМУЩЕСТВО КОРОТКОГО ЦЕПЬ
Спасибо и с уважением,
Rk_Hirpara