bonjour,

Envoyé par
StringBuilder
Le ISNULL(), spécifique à SQL Server, serait plus optimisé et parfois changerait même complètement le plan d'exécution.
C'est en effet le cas.

Envoyé par
StringBuilder
J'avoue ne pas comprendre non plus comment SQL Server peut ne pas considérer COALESCE(arg1, arg2) comme un simple alias de ISNULL(arg1, arg2).
Justement parce que les deux fonctions ne sont pas tout à fait identiques même si elles adressent le même besoin.

Envoyé par
StringBuilder
Je suppose, mais sans en être complètement certain, qu'il existe un ou plusieurs cas où les deux fonctions ne font pas la même chose :
- mixité des types
- résultat forcément non null
- autre ?
Le type de retour n'est en effet pas le même.
- ISNULL renvoie le type du premier argument
- COALESCE renvoie le type de l'argument ayant la plus forte précédence :
1 2 3 4
| DECLARE @a VARCHAR(3)
DECLARE @b VARCHAR(4) = 'toto'
SELECT COALESCE(@a, @b) AS r_coalesce, ISNULL(@a, @b) as r_isnull |
==>
r_coalesce r_isnull
toto tot
Il existe également un différence de comportement notable :
Avec un COALESCE, les expressions sont interprétées une fois pour tester la nullité, et une deuxième fois pour renvoyer la valeur non NULL, ce qui n'est pas vraiment génant quand on teste une simple colonne, mais peut le devenir quand on fait appel a une sous requête, ou une fonction couteuse :
1 2 3 4 5 6 7 8 9 10
|
CREATE FUNCTION UDF_TEST ()
RETURNS INT
AS
BEGIN
DECLARE @x int = 0;
WHILE (@x < 1000000) SET @x += 1;
RETURN 0;
END |
SELECT ISNULL(dbo.udf_test(), 0)
SQL Server \endash Temps d'exécution*:
, Temps UC = 452*ms, temps écoulé = 587*ms.
SELECT COALESCE(dbo.udf_test(), 0)
SQL Server \endash Temps d'exécution*:
, Temps UC = 889*ms, temps écoulé = 1239*ms.
Cela peut même donner des résultats inattendus :
1 2 3 4 5 6 7 8
| CREATE FUNCTION UDF_TEST (@i VARCHAR(50))
RETURNS INT
AS
BEGIN
RETURN CASE WHEN @i like '[0-8]%' THEN NULL ELSE 1 END;
END |
SELECT COALESCE(dbo.udf_test(NEWID()), 0)
peut parfois renvoyer :
Alors qu'un ISNULL renverra toujours 0 ou 1;
Partager