Après avoir lu cet article intéressant sur la matérialisation intermédiaire – j'ai encore quelques questions.
J'ai cette requête:
SELECT * FROM ... WHERE isnumeric(MyCol)=1 and ( CAST( MyCol AS int)>1)
Cependant, l'ordre de clause where n'est pas déterministe.
Donc, je pourrais avoir une exception ici (s'il essaye d'abord de lancer "k1k1"
)
Je suppose que cela va résoudre le problème
SELECT MyCol FROM (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (MyCol ) > 1 ORDER BY MyCol ) bar WHERE CAST(MyCol AS int) > 100
top 100 + order
change ma requête habituelle? J'ai lu dans les commentaires:
(le résultat "intermédiaire" – en d'autres termes, un résultat obtenu au cours du process, qui sera utilisé pour calculer le résultat final) sera physiquement stocké ("matérialisé") dans TempDB et utilisé à partir de là pour le rest de l'user , au lieu d'être interrogé à partir des tables de base.
La manière prise en charge pour éviter les erreurs dues à la réorganisation de l'optimiseur consiste à utiliser CASE :
SELECT * FROM YourTable WHERE 1 <= CASE WHEN aa NOT LIKE '%[^0-9]%' THEN CONVERT(int, aa) ELSE 0 END;
La matérialisation intermédiaire n'est pas une technique supscope, elle ne devrait donc être utilisée que par des users très experts dans des circonstances particulières où les risques sont compris et acceptés.
TOP 100 PERCENT
est généralement ignoré par l'optimiseur dans SQL Server 2005 et ultérieur.
En ajoutant la clause TOP dans la requête interne, vous obligez SQL Server à exécuter cette requête avant d'exécuter la requête externe, annulant ainsi toutes les lignes pour lesquelles ISNUMERIC renvoie la valeur false.
Sans la clause TOP, l'optimiseur peut réécrire la requête pour qu'elle soit identique à votre première requête.