Đây là một "tính năng" đã biết của SQL Server. Đừng bao giờ cho rằng mệnh đề WHERE thực thi trước mệnh đề CHỌN.
Xem: Máy chủ SQL nên không nêu ra các lỗi phi logic
Thực sự có những lý do chính đáng để làm điều đó đôi khi. Hãy xem xét việc kết hợp hai bảng, với A nhỏ hơn nhiều so với B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Nếu bạn kiểm tra kế hoạch truy vấn được tạo, đúng hay sai, máy chủ SQL sẽ truyền dữ liệu từ A dưới dạng các hàng hàng đầu để kết hợp với B. Trong khi làm điều đó, nó biết rằng nó chỉ cần kéo col2
và hàm function on col1
. Nó có thể mang lại col1
chỉ để chạy chức năng sau này hoặc đối với một thứ gì đó nhỏ nhặt như CAST, SQL Server cũng có thể chuyển đổi dữ liệu trong quá trình phát trực tuyến.
Một điều chắc chắn là chiến lược này làm cho SQL Server nhanh hơn một chút trong các truy vấn nhất định. Nhưng trên góc độ logic thuần túy, tôi sẽ gọi nó là một lỗi.