Co powiesz na ten - jak mi to powiedział Itzik Ben-Gan, któremu opowiedział o tym Jaime Lafargue ?
DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
Wynik:
Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
Istnieją oczywiście trywialne obejścia, ale nadal chodzi o to, że CASE
nie zawsze gwarantuje to ocenę / zwarcie od lewej do prawej. Zgłosiłem błąd tutaj i został on zaprojektowany jako „z założenia”. Następnie Paul White złożył przedmiot Connect , który został zamknięty jako Naprawiony. Nie dlatego, że został naprawiony per se, ale dlatego, że zaktualizowali Books Online o dokładniejszy opis scenariusza, w którym agregaty mogą zmienić kolejność oceny CASE
wyrażenia. Ostatnio pisałem o tym więcej na blogu .
EDYTUJ tylko dodatek, podczas gdy zgadzam się, że są to przypadki skrajne, że przez większość czasu możesz polegać na ocenie od lewej do prawej i zwarciach oraz że są to błędy, które są sprzeczne z dokumentacją i prawdopodobnie zostaną ostatecznie naprawione ( to nie jest jednoznaczne - zobacz dalszą rozmowę na blogu Barta Duncana, aby dowiedzieć się, dlaczego), muszę się nie zgodzić, gdy ludzie mówią, że coś jest zawsze prawdziwe, nawet jeśli istnieje jeden przypadek, który to obala. Jeśli Itzik i inni mogą znaleźć takie pojedyncze błędy, to przynajmniej w sferze prawdopodobieństwa, że są też inne błędy. A ponieważ nie znamy reszty zapytania OP, nie możemy z całą pewnością stwierdzić, że będzie polegał na tym zwarciu, ale w końcu zostanie ugryziony. Więc dla mnie bezpieczniejsza odpowiedź to:
Chociaż zwykle można polegać na CASE
ocenie zwarcia od lewej do prawej i zwarcia, jak opisano w dokumentacji, nie jest właściwe stwierdzenie, że zawsze można to zrobić. Na tej stronie pokazano dwa przypadki, w których nie jest to prawda, i żaden błąd nie został naprawiony w żadnej publicznie dostępnej wersji programu SQL Server.
EDYCJA tutaj to kolejny przypadek (muszę przestać to robić), w którym CASE
wyrażenie nie ocenia się w oczekiwanej kolejności, nawet jeśli nie są w to zaangażowane agregacje.
CASE
zawsze ocenia się od lewej do prawej i zawsze zwarcia ).