Dies ist ein bekanntes "Feature" von SQL Server. Gehen Sie niemals davon aus, dass die WHERE-Klausel vor der SELECT-Klausel ausgeführt wird.
Siehe:SQL Server sollte keine unlogischen Fehler auslösen
Dafür gibt es manchmal gute Gründe. Erwägen Sie, zwei Tische zu verbinden, wobei A viel kleiner als B ist.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Wenn Sie den generierten Abfrageplan zu Recht oder zu Unrecht überprüfen, streamt der SQL-Server die Daten von A als führende Zeilen, um sie mit B zu verknüpfen. Dabei weiß er, dass er nur col2
abrufen muss und function on col1
. Es könnte col1
bringen nur um die Funktion später auszuführen, oder für etwas so Triviales wie CAST, kann SQL Server die Daten genauso gut während des Streaming-Prozesses umwandeln.
Eines ist sicher, diese Strategie macht SQL Server bei bestimmten Abfragen ein wenig schneller. Aber aus rein logischer Sicht würde ich es einen Fehler nennen.