Nie możesz liczyć na kolejność, w jakiej baza danych będzie oceniać wyrażenia filtrujące. Istnieje optymalizator zapytań, który oceni Twój kod SQL i zbuduje plan wykonania zapytania na podstawie tego, co postrzega, co zapewni najlepszą wydajność .
W tym kontekście IsNumeric()
nie może być używany z indeksem, a to oznacza uruchamianie funkcji dla każdego wiersza w tabeli. Dlatego prawie nigdy zapewniają najlepszą postrzeganą wydajność. Porównaj to z SrcID > 15
wyrażenie, które może być dopasowane do indeksu (jeśli taki istnieje) i jest tylko wyrażeniem z jednym operatorem, nawet jeśli tak nie jest. Może być również używany do filtrowania liczby potencjalnych wierszy, w których IsNumeric()
funkcja musi działać.
Prawdopodobnie możesz obejść ten problem za pomocą widoku, podzapytania, CTE, instrukcji CASE lub kolumny obliczeniowej. Oto przykład CTE:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
A oto opcja instrukcji CASE:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15