Il s'agit d'une "fonctionnalité" connue de SQL Server. Ne présumez jamais que la clause WHERE s'exécute avant la clause SELECT.
Voir :SQL Server doit ne génère pas d'erreurs illogiques
Il y a en fait de bonnes raisons de le faire parfois. Envisagez de joindre deux tables, A étant beaucoup plus petit que B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Si vous inspectez le plan de requête généré, à tort ou à raison, le serveur SQL diffusera les données de A en tant que premières lignes à joindre à B. Ce faisant, il sait qu'il n'a qu'à extraire col2
et function on col1
. Cela pourrait apporter col1
juste pour exécuter la fonction plus tard, ou pour quelque chose d'aussi trivial que CAST, SQL Server pourrait tout aussi bien transformer les données pendant le processus de diffusion.
Une chose est sûre, cette stratégie rend SQL Server un peu plus rapide dans certaines requêtes. Mais d'un point de vue purement logique, j'appellerais cela un bug.