Nemůžete počítat s pořadím, ve kterém bude databáze vyhodnocovat filtrační výrazy. Existuje optimalizátor dotazů, který vyhodnotí vaše SQL a vytvoří plán pro provedení dotazu na základě toho, co podle něj přinese nejlepší výkon .
V tomto kontextu IsNumeric()
nelze použít s indexem a znamená to spuštění funkce proti každému řádku v tabulce. Proto to téměř nikdy nebude poskytují nejlepší vnímaný výkon. Porovnejte to s SrcID > 15
výraz, který lze porovnat s indexem (pokud nějaký existuje), a je pouze jediným operátorovým výrazem, i když tomu tak není. Lze jej také použít k odfiltrování počtu potenciálních řádků, kde IsNumeric()
funkce musí být spuštěna.
Pravděpodobně to můžete obejít pomocí pohledu, poddotazu, CTE, příkazu CASE nebo vypočítaného sloupce. Zde je příklad CTE:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
A zde je možnost příkazu CASE:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15