Bạn không thể tin tưởng vào thứ tự mà cơ sở dữ liệu sẽ đánh giá các biểu thức lọc. Có một trình tối ưu hóa truy vấn sẽ đánh giá SQL của bạn và xây dựng một kế hoạch để thực thi truy vấn dựa trên những gì nó nhận thấy sẽ mang lại hiệu suất tốt nhất .
Trong ngữ cảnh này, IsNumeric()
không thể được sử dụng với một chỉ mục và nó có nghĩa là chạy một hàm đối với mọi hàng trong bảng. Do đó, nó sẽ hầu như không bao giờ cung cấp hiệu suất cảm nhận tốt nhất. So sánh điều này với SrcID > 15
biểu thức, có thể được so khớp với một chỉ mục (nếu tồn tại) và chỉ là một biểu thức toán tử duy nhất ngay cả khi không có. Nó cũng có thể được sử dụng để lọc số hàng tiềm năng có IsNumeric()
chức năng cần chạy.
Bạn có thể giải quyết vấn đề này với một dạng xem, một truy vấn con, một CTE, một câu lệnh CASE hoặc một cột được tính toán. Đây là một ví dụ về CTE:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
Và đây là một tùy chọn câu lệnh CASE:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15