Не можете да разчитате на реда, в който базата данни ще оцени филтриращите изрази. Има оптимизатор на заявки, който ще оцени вашия SQL и ще изгради план за изпълнение на заявката въз основа на това, което възприема, че ще доведе до най-добра производителност .
В този контекст, IsNumeric()
не може да се използва с индекс и означава изпълнение на функция срещу всеки ред в таблицата. Следователно почти никога няма осигуряват най-доброто възприемано представяне. Сравнете това с SrcID > 15
израз, който може да бъде съпоставен с индекс (ако съществува такъв) и е просто израз на единичен оператор, дори ако такъв не съществува. Може също да се използва за филтриране на броя потенциални редове, където IsNumeric()
функцията трябва да се изпълни.
Вероятно можете да заобиколите това с изглед, подзаявка, CTE, оператор CASE или изчислена колона. Ето пример за CTE:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
И ето опция за оператор CASE:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15