Esta es una "característica" conocida de SQL Server. Nunca asuma que la cláusula WHERE se ejecuta antes que la cláusula SELECT.
Ver:SQL Server debería no generar errores ilógicos
En realidad, hay buenas razones para hacerlo a veces. Considere unir dos mesas, siendo A mucho más pequeña que B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Si inspecciona el plan de consulta generado, correcta o incorrectamente, el servidor SQL transmitirá los datos de A como las filas principales para unirlos con B. Mientras lo hace, sabe que solo necesita extraer col2
y function on col1
. Podría traer col1
solo para ejecutar la función más tarde, o para algo tan trivial como CAST, SQL Server también podría transformar los datos durante el proceso de transmisión.
Una cosa es segura, esta estrategia hace que SQL Server sea un poco más rápido en ciertas consultas. Pero desde una perspectiva puramente lógica, lo llamaría un error.