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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
select sum(0) 
having sum(0) >0  and 1/sum(0) >0
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 :

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 :

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
Ce qui génère :
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 !