これは、SQL Server の既知の "機能" です。 WHERE 句が SELECT 句の前に実行されると想定しないでください。
実際には、それを行うのには十分な理由があります。 A が B よりもはるかに小さい 2 つのテーブルを結合することを検討してください。
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
生成されたクエリ プランを検査すると、正しいか間違っているかに関係なく、SQL サーバーは A からのデータを B に対して結合する先行行としてストリーミングします。 そして col1 の関数
. col1
をもたらす可能性があります 後で関数を実行するためだけに、または CAST のような些細なことのために、SQL Server はストリーミング プロセス中にデータを変換することもできます。
確かなことは、この戦略により、特定のクエリで SQL Server が少し速くなることです。しかし、純粋に論理的な観点から言えば、私はこれをバグと呼んでいます.