Este é um "recurso" conhecido do SQL Server. Nunca assuma que a cláusula WHERE é executada antes da cláusula SELECT.
Consulte:SQL Server deve não levantar erros ilógicos
Há realmente boas razões para fazer isso às vezes. Considere juntar duas tabelas, com A sendo muito menor que B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Se você inspecionar o plano de consulta gerado, com ou sem razão, o SQL Server transmitirá os dados de A como as linhas principais para unir em B. Ao fazer isso, ele sabe que só precisa extrair
col2
e function on col1
. Poderia trazer col1
apenas para executar a função mais tarde, ou para algo tão trivial quanto CAST, o SQL Server também pode transformar os dados durante o processo de streaming. Uma coisa é certa, essa estratégia torna o SQL Server um pouco mais rápido em determinadas consultas. Mas em uma perspectiva puramente lógica, eu chamaria isso de bug.