Non puoi contare sull'ordine in cui un database valuterà le espressioni di filtro. Esiste un Query Optimizer che valuterà il tuo SQL e creerà un piano per eseguire la query in base a ciò che percepisce produrrà le migliori prestazioni .
In questo contesto, IsNumeric()
non può essere utilizzato con un indice e significa eseguire una funzione su ogni riga della tabella. Pertanto, quasi mai fornire le migliori prestazioni percepite. Confrontalo con SrcID > 15
espressione, che può essere confrontata con un indice (se ne esiste uno), ed è solo un'espressione di un singolo operatore anche se non ne esiste uno. Può anche essere utilizzato per filtrare il numero di righe potenziali in cui IsNumeric()
la funzione deve essere eseguita.
Probabilmente puoi aggirare questo problema con una vista, una sottoquery, un CTE, un'istruzione CASE o una colonna calcolata. Ecco un esempio di CTE:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
Ed ecco un'opzione di istruzione CASE:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15