Як щодо цього - як мені повідомив Іцік Бен-Ган, який розповів про це Хайме Лафаргу ?
DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
Результат:
Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
Звичайно, є тривіальні шляхи вирішення, але все-таки справа не в тому, що CASE
це не завжди гарантує оцінку / коротке замикання зліва направо. Я повідомив про помилку тут, і це було закрито як "задумом". Згодом Пол Уайт подав цей елемент Connect , і він був закритий як Виправлений. Не тому, що воно було зафіксовано як таке, а тому, що вони оновлювали Книги онлайн з більш точним описом сценарію, коли агрегати можуть змінювати порядок оцінювання CASE
виразу. Нещодавно я більше про це розповідав тут .
EDIT - це лише доповнення, але я погоджуюся, що це кращі випадки, що більшу частину часу ви можете покластися на оцінку зліва направо і коротке замикання, і що це помилки, які суперечать документації і, ймовірно, з часом будуть виправлені ( це не визначено - див. подальшу розмову в публікації блогу Барта Данкана, щоб дізнатися, чому), я повинен не погодитися, коли люди кажуть, що щось завжди правдиво, навіть якщо є один крайній випадок, який спростує це. Якщо Іцік та інші можуть знайти одиночні помилки, як це, це робить принаймні в царині можливості, що є й інші помилки. І оскільки ми не знаємо решти запитів ОП, ми не можемо сказати напевно, що він буде покладатися на це коротке замикання, але в кінцевому підсумку його вкусить. Тож для мене більш безпечна відповідь:
Хоча зазвичай можна покластися на CASE
оцінку зліва направо та на коротке замикання, як це описано в документації, не точно сказати, що ви завжди можете це зробити. На цій сторінці є два продемонстровані випадки, коли це неправда, і жодна помилка не була виправлена в жодній загальнодоступній версії SQL Server.
EDIT - це ще один випадок (мені потрібно припинити це робити), коли CASE
вираз не оцінюється в тому порядку, який ви очікували, навіть якщо сукупності не беруть участь.
CASE
завжди оцінюється зліва направо і завжди коротке замикання ).