Bonjour à tous,
ayant migré depuis peu sur SQL Server 2012, nous venons de constater un changement dans la manière d'évaluer les expression logiques dans la clause having.
J'ai crée une requête simplifiée qui permet de constater le problème :
L'objectif est de tester la valeur d'une division. Evidemment, avant toute division, il est nécessaire de vérifier si la valeur du diviseur n'est pas égale à 0, c'est ce que je fais avec sum(0)>0. Sauf que la, il génère l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select sum(0) having sum(0) >0 and 1/sum(0) >0
Msg 8134, Level 16, State 1, Line 1
Division par zéro.
SQL Server a donc évaluter toutes les expressions, malgré le fait que la première est fausse.
Dans notre précédente version d'SQL Server 2000, cela fonctionnait bien. D'autre part, un test similaire dans la clause WHERE ne génère pas d'erreur.
Le problème peut etre reproduit avec d'autre condition comme :
Ce qui génère :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select 1, ISNUMERIC(num) from (select '12J' as num) t group by num having ISNUMERIC((num))=1 and max(cast(num as int)) >0
Server: Msg 245, Level 16, State 1, Line 1
Échec de la conversion de la valeur varchar '12J' en type de données int.
Question : est-ce normal ? ya t-il un moyen de lui indiquer de ne pas évaluer les autres expressions si la première est fausse ?
Merci pour vos éclairages !
Partager