Wie wäre es damit - wie mir Itzik Ben-Gan berichtet hat, dem Jaime Lafargue davon erzählt hat ?
DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
Ergebnis:
Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
Natürlich gibt es triviale Problemumgehungen, aber der Punkt ist immer noch, dass CASE
nicht immer eine Auswertung von links nach rechts / ein Kurzschluss gewährleistet ist. Ich habe den Fehler hier gemeldet und er wurde als "beabsichtigt" geschlossen. Paul White hat dieses Connect-Objekt anschließend abgelegt und es wurde als "Fest" geschlossen. Nicht, weil es per se behoben wurde, sondern weil die Onlinedokumentation mit einer genaueren Beschreibung des Szenarios aktualisiert wurde, in dem Aggregate die Auswertungsreihenfolge eines CASE
Ausdrucks ändern können . Ich habe kürzlich mehr darüber hier gebloggt .
BEARBEITEN Sie nur einen Nachtrag, obwohl ich einverstanden bin, dass dies Randfälle sind, dass Sie sich die meiste Zeit auf die Auswertung von links nach rechts und das Kurzschließen verlassen können und dass dies Fehler sind, die der Dokumentation widersprechen und wahrscheinlich irgendwann behoben werden ( das ist nicht eindeutig - siehe das folgende Gespräch in Bart Duncans Blog-Post, um zu sehen, warum), ich muss nicht zustimmen, wenn Leute sagen, dass etwas immer wahr ist, auch wenn es einen Einzelfall gibt, der es widerlegt. Wenn Itzik und andere einsame Bugs wie dieses finden, ist es zumindest möglich, dass es auch andere Bugs gibt. Und da wir den Rest der OP-Anfrage nicht kennen, können wir nicht mit Sicherheit sagen, dass er sich auf diesen Kurzschluss verlassen wird, aber am Ende von ihm gebissen wird. Für mich ist die sicherere Antwort:
Während Sie sich normalerweise darauf verlassen können CASE
, wie in der Dokumentation beschrieben, von links nach rechts und den Kurzschluss zu bewerten, ist es nicht genau zu sagen, dass Sie dies immer tun können. Auf dieser Seite werden zwei Fälle gezeigt, in denen dies nicht zutrifft und keiner der Fehler in einer öffentlich verfügbaren Version von SQL Server behoben wurde.
BEARBEITEN ist ein weiterer Fall (ich muss damit aufhören), in dem ein CASE
Ausdruck nicht in der erwarteten Reihenfolge ausgewertet wird, obwohl keine Aggregate beteiligt sind.
CASE
immer von links nach rechts und immer Kurzschlüsse ausgewertet werden ).