Ini adalah "fitur" yang dikenal dari SQL Server. Jangan pernah berasumsi bahwa klausa WHERE dieksekusi sebelum klausa SELECT.
Lihat:SQL Server harus tidak memunculkan kesalahan yang tidak logis
Sebenarnya ada alasan bagus untuk melakukan itu kadang-kadang. Pertimbangkan untuk menggabungkan dua tabel, dengan A jauh lebih kecil dari B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Jika Anda memeriksa rencana kueri yang dihasilkan, benar atau salah, server SQL akan mengalirkan data dari A sebagai baris terdepan untuk digabungkan dengan B. Saat melakukan itu, ia tahu bahwa itu hanya perlu menarik col2
dan function on col1
. Itu bisa membawa col1
melalui hanya untuk menjalankan fungsi nanti, atau untuk sesuatu yang sepele seperti CAST, SQL Server mungkin juga mengubah data selama proses streaming.
Satu hal yang pasti, strategi ini membuat SQL Server sedikit lebih cepat dalam kueri tertentu. Tetapi pada perspektif yang murni logis, saya akan menyebutnya bug.