Как насчет этого - как мне сообщил Ицик Бен-Ган, которому об этом рассказал Хайме Лафарг ?
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
не всегда гарантируется оценка / короткое замыкание слева направо. Я сообщил об ошибке здесь, и она была закрыта как «по замыслу». Впоследствии Пол Уайт подал этот элемент подключения , и он был закрыт как исправленный. Не потому, что это было исправлено само по себе, а потому, что они обновили Books Online с более точным описанием сценария, в котором агрегаты могут изменять порядок оценки CASE
выражения. Я недавно написал больше об этом здесь .
РЕДАКТИРОВАТЬ только приложение, хотя я согласен, что это крайние случаи, что большую часть времени вы можете полагаться на оценку слева-направо и короткие замыкания, и что это ошибки, которые противоречат документации и, вероятно, в конечном итоге будут исправлены ( это не определенно - посмотрите последующий разговор в блоге Барта Дункана, чтобы понять, почему), я должен не согласиться, когда люди говорят, что что-то всегда верно, даже если есть один крайний случай, который опровергает это. Если Ицик и другие могут найти такие одиночные ошибки, как это, то, по крайней мере, существует вероятность того, что есть и другие ошибки. А поскольку мы не знаем остальной части запроса ОП, мы не можем с уверенностью сказать, что он будет полагаться на это короткое замыкание, но в конечном итоге его укусит. Поэтому для меня более безопасный ответ:
Хотя обычно вы можете рассчитывать на CASE
оценку слева направо и на наличие короткого замыкания, как описано в документации, неверно говорить, что вы всегда можете это сделать. На этой странице есть два продемонстрированных случая, где это не так, и ни одна ошибка не была исправлена ни в одной общедоступной версии SQL Server.
EDIT - это еще один случай (мне нужно прекратить это делать), когда CASE
выражение оценивается не в том порядке, в котором вы ожидаете, даже если не используются никакие агрегаты.
CASE
всегда оценивает слева направо и всегда короткие замыкания ).