U kunt niet rekenen op de volgorde waarin een database filterexpressies evalueert. Er is een query-optimalisatieprogramma dat uw SQL evalueert en een plan maakt om de query uit te voeren op basis van wat het de beste prestaties ziet opleveren .
In deze context, IsNumeric()
kan niet worden gebruikt met een index, en het betekent het uitvoeren van een functie voor elke rij in de tabel. Daarom zal het bijna nooit de best waargenomen prestatie leveren. Vergelijk dit met de SrcID > 15
expressie, die kan worden gekoppeld aan een index (als die bestaat), en is slechts een enkele operatorexpressie, zelfs als die niet bestaat. Het kan ook worden gebruikt om het aantal potentiële rijen te filteren waar de IsNumeric()
functie moet worden uitgevoerd.
U kunt dit waarschijnlijk omzeilen met een weergave, een subquery, een CTE, een CASE-instructie of een berekende kolom. Hier is een CTE-voorbeeld:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
En hier is een CASE-instructieoptie:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15