Du kan inte räkna med i vilken ordning en databas kommer att utvärdera filtreringsuttryck. Det finns en frågeoptimerare som kommer att utvärdera din SQL och bygga en plan för att köra frågan baserat på vad den uppfattar kommer att ge bästa prestanda .
I detta sammanhang, IsNumeric()
kan inte användas med ett index, och det innebär att en funktion körs mot varje rad i tabellen. Därför kommer det nästan aldrig ge den bästa upplevda prestandan. Jämför detta med SrcID > 15
uttryck, som kan matchas med ett index (om ett sådant finns), och är bara ett enstaka operatoruttryck även om ett inte gör det. Den kan också användas för att filtrera ner antalet potentiella rader där IsNumeric()
funktionen måste köras.
Du kan förmodligen komma runt detta med en vy, en underfråga, en CTE, en CASE-sats eller en beräknad kolumn. Här är ett CTE-exempel:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
Och här är ett CASE-uttalande alternativ:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15