Detta är en känd "funktion" i SQL Server. Anta aldrig att WHERE-satsen körs före SELECT-satsen.
Se:SQL Server bör inte ta upp ologiska fel
Det finns faktiskt goda skäl att göra det ibland. Överväg att slå samman två tabeller, där A är mycket mindre än B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Om du inspekterar frågeplanen som genererats, med rätta eller fel, kommer SQL-servern att strömma data från A som de ledande raderna för att sammanfoga mot B. Medan den gör det vet den att den bara behöver dra col2
och function on col1
. Det kan ge col1
genom att bara köra funktionen senare, eller för något så trivialt som CAST, kan SQL Server lika gärna transformera data under streamingprocessen.
En sak är säker, den här strategin gör SQL Server lite snabbare i vissa frågor. Men ur ett rent logiskt perspektiv skulle jag kalla det en bugg.