CORRECTIF : Des appels multiples à une fonction définie par l'utilisateur à l'intérieur d'une fonction d'agrégation peuvent renvoyer des résultats incorrects

Ancien nº de publication de cet article : F288957
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
N° DE BOGUE : 236595 (SHILOH_BUGS)
Symptômes
SQL Server risque de renvoyer des résultats incorrects pour une requête lorsque les conditions suivantes sont réunies :
  • la requête contient au moins deux références à la même fonction d'agrégation ;
  • ces fonctions d'agrégation utilisent pour paramètre les résultats d'un appel à la même fonction définie par l'utilisateur (UDF, User Defined Function) ;
  • les appels à la fonction UDF passent le même premier paramètre ;
  • La fonction UDF utilise au moins deux paramètres et les résultats qu'elle renvoie dépendent de la valeur de ces paramètres secondaires.
Cause
L'optimiseur recherche les fonctions d'agrégation en double dans la requête de manière à ce que chaque agrégat unique ne soit calculé qu'une seule fois. Ce code ne prend pas en compte les paramètres secondaires passés à une fonction UDF et peut donc identifier incorrectement deux agrégats comme étant équivalents.
Résolution
Pour résoudre ce problème, procurez-vous le dernier Service Pack pour Microsoft SQL Server 2000. Pour plus d'informations, consultez l'article suivant de la Base de connaissances Microsoft :
290211 INF : Procédures pour obtenir le dernier Service Pack pour SQL Server 2000

Correctif

REMARQUE : Le correctif suivant a été créé avant le Service Pack 1 pour Microsoft SQL Server 2000.

La version anglaise de ce correctif doit avoir les attributs de fichier suivants ou ultérieurs :
   Version     Nom du fichier   Plate-forme   ----------------------------------------   8.00.251    s80251i.exe      x86
Statut
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section "Liste des produits concernés par cet article". Ce problème a été corrigé dans Microsoft SQL Server 2000 Service Pack 1.
Plus d'informations
L'exemple suivant illustre le problème.

CREATE TABLE functest (c1 int NULL, c2 int NULL, c3 int NULL, c4 int NULL, c5 int NULL, c6 int NULL)GOINSERT INTO functest VALUES(1,2,3,4,5,6)goCREATE FUNCTION t3 (@one int, @two int, @three int) RETURNS int ASBEGIN  RETURN (@one*@two*@three)ENDGO--Ceci renvoie 720, correctSELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c4,c5,c6)) correct FROM functestgo--Ceci renvoie 36 au lieu de 180, incorrectSELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c1,c5,c6)) incorrect FROM functestgo--Si vous échangez c1 et c6, les résultats sont corrects ! (180)SELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c6,c5,c1)) correct FROM functest
Notez que vous obtenez des résultats incorrects uniquement si les deux références à la fonction UDF passent le même premier paramètre à la fonction, comme nom de colonne ou comme valeur littérale.
Propriétés

ID d'article : 288957 - Dernière mise à jour : 01/16/2015 21:37:46 - Révision : 4.1

  • Microsoft SQL Server 2000 Standard
  • kbnosurvey kbarchive _ik kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix KB288957
Commentaires