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

Traductions disponibles Traductions disponibles
Numéro d'article: 288957 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F288957
N° DE BOGUE : 236595 (SHILOH_BUGS)
Agrandir tout | Réduire tout

Sommaire

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)
GO
INSERT INTO functest VALUES(1,2,3,4,5,6)
go
CREATE FUNCTION t3 (@one int, @two int, @three int) RETURNS int AS
BEGIN
  RETURN (@one*@two*@three)
END
GO
--Ceci renvoie 720, correct
SELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c4,c5,c6)) correct FROM functest
go
--Ceci renvoie 36 au lieu de 180, incorrect
SELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c1,c5,c6)) incorrect FROM functest
go
--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

Numéro d'article: 288957 - Dernière mise à jour: jeudi 6 novembre 2003 - Version: 4.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2000 Standard
Mots-clés : 
_ik kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix KB288957
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com