¿Qué tal este, según me informó Itzik Ben-Gan, a quien Jaime Lafargue le contó ?
DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
Resultado:
Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
Hay soluciones triviales, por supuesto, pero el punto es que CASE
no siempre garantiza una evaluación / cortocircuito de izquierda a derecha. Informé el error aquí y se cerró como "por diseño". Posteriormente, Paul White archivó este elemento Connect y se cerró como Fijo. No porque se haya solucionado per se, sino porque actualizaron Books Online con una descripción más precisa del escenario en el que los agregados pueden cambiar el orden de evaluación de una CASE
expresión. Recientemente escribí más sobre esto aquí .
EDITE solo un apéndice, aunque estoy de acuerdo en que estos son casos extremos, que la mayoría de las veces puede confiar en la evaluación de izquierda a derecha y en cortocircuito, y que estos son errores que contradicen la documentación y probablemente eventualmente se solucionarán ( esto no es definitivo: vea la conversación de seguimiento en la publicación del blog de Bart Duncan para ver por qué), tengo que estar en desacuerdo cuando la gente dice que algo siempre es cierto, incluso si hay un caso de borde único que lo refuta. Si Itzik y otros pueden encontrar errores solitarios como este, al menos es posible que también haya otros errores. Y dado que no conocemos el resto de la consulta del OP, no podemos decir con certeza que dependerá de este cortocircuito, pero terminará siendo mordido por él. Entonces, para mí, la respuesta más segura es:
Si bien generalmente puede confiar CASE
para evaluar el cortocircuito de izquierda a derecha, como se describe en la documentación, no es exacto decir que siempre puede hacerlo. Hay dos casos demostrados en esta página en los que no es cierto, y ninguno de los errores se ha corregido en ninguna versión pública de SQL Server.
EDITAR aquí es otro caso (necesito dejar de hacerlo) en el que una CASE
expresión no se evalúa en el orden que esperaría, aunque no haya agregados involucrados.
CASE
siempre evalúe los circuitos de izquierda a derecha y siempre cortocircuitos )