Qu'en est-il de celui-ci - comme cela m'a été rapporté par Itzik Ben-Gan, à qui Jaime Lafargue en a parlé ?
DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
Résultat:
Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
Il existe bien sûr des solutions de contournement triviales, mais le fait est que CASE
cela ne garantit pas toujours une évaluation / un court-circuit de gauche à droite. J'ai signalé le bug ici et il a été fermé comme "par la conception." Paul White a ultérieurement classé cet élément Connect , qui a été fermé comme étant corrigé. Non pas parce que cela a été corrigé en soi, mais parce qu'ils ont mis à jour la documentation en ligne avec une description plus précise du scénario dans lequel les agrégats peuvent modifier l'ordre d'évaluation d'une CASE
expression. J'ai récemment blogué plus à ce sujet ici .
EDIT juste un addendum, bien que je convienne que ce sont des cas extrêmes, que la plupart du temps, vous pouvez vous fier à une évaluation de gauche à droite et à des courts-circuits, et que ce sont des bogues contrariant la documentation et susceptibles d'être corrigés ( ce n'est pas certain - consultez la conversation de suivi sur le blog de Bart Duncan pour savoir pourquoi), je ne suis pas d'accord quand des gens disent que quelque chose est toujours vrai même s'il y a un seul cas qui le réfute. Si Itzik et d’autres peuvent trouver des bogues solitaires comme celui-ci, il est au moins possible qu’il y ait d’autres bogues. Et comme nous ne connaissons pas le reste de la requête du PO, nous ne pouvons pas affirmer avec certitude qu'il s'en remettra à ce court-circuit mais finira par se faire mordre. Donc, pour moi, la réponse la plus sûre est:
Comme vous pouvez généralement vous fier CASE
à l’évaluation gauche à droite et aux courts-circuits, comme indiqué dans la documentation, il n’est pas exact de dire que vous pouvez toujours le faire. Sur cette page, il existe deux cas de figure où ce n'est pas vrai et où aucun bogue n'a été corrigé dans aucune version publique de SQL Server.
EDIT est un autre cas (je dois cesser de le faire) où une CASE
expression ne s’évalue pas dans l’ordre que vous attendez, même si aucun agrégat n’est impliqué.
CASE
on évalue toujours les circuits de gauche à droite et toujours courts. ).