Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

IsNumeric dans SQL Server JOIN

Vous ne pouvez pas compter sur l'ordre dans lequel une base de données évaluera les expressions de filtrage. Il existe un optimiseur de requêtes qui évaluera votre SQL et élaborera un plan pour exécuter la requête en fonction de ce qu'il perçoit pour obtenir les meilleures performances .

Dans ce contexte, IsNumeric() ne peut pas être utilisé avec un index, et cela signifie exécuter une fonction sur chaque ligne de la table. Par conséquent, il ne sera presque jamais offrent les meilleures performances perçues. Comparez cela avec le SrcID > 15 expression, qui peut être associée à un index (s'il en existe un), et n'est qu'une expression d'opérateur unique même s'il n'en existe pas. Il peut également être utilisé pour filtrer le nombre de lignes potentielles où le IsNumeric() la fonction doit s'exécuter.

Vous pouvez probablement contourner ce problème avec une vue, une sous-requête, un CTE, une instruction CASE ou une colonne calculée. Voici un exemple CTE :

With NumericOnly As 
(
    SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15

Et voici une option d'instruction CASE :

SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15