Dette er en kendt "funktion" i SQL Server. Antag aldrig, at WHERE-sætningen udføres før SELECT-sætningen.
Se:SQL-serveren bør ikke rejse ulogiske fejl
Der er faktisk gode grunde til at gøre det nogle gange. Overvej at samle to tabeller, hvor A er meget mindre end B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Hvis du inspicerer den genererede forespørgselsplan, med rette eller forkerte, vil SQL-serveren streame dataene fra A som de førende rækker for at slutte sig til B. Mens den gør det, ved den, at den kun behøver at trække col2
og function on col1
. Det kunne bringe col1
gennem bare for at køre funktionen senere, eller for noget så trivielt som CAST, kan SQL Server lige så godt transformere dataene under streamingprocessen.
En ting er sikkert, denne strategi gør SQL Server en smule hurtigere i visse forespørgsler. Men ud fra et rent logisk perspektiv vil jeg kalde det en fejl.