Fonction Scalaire et Clause WHERE
Bonjour,
Je met à jour actuellement un logiciel qui doit déterminer des minutes de communications utilisé sur une carte Fax.
Il y a une table qui contient des données concernant le tarif d'une zone Fax et une autre stockant des minutes de communication.
Une zone est déterminé via des opération complexes et plusieurs requêtes. La base ne pouvant être modifié, ce calcul a été déplace du logiciel vers la base en une fonction.
Code:
dbo.GetZoneFax(doc.AdresseDest)
(AdresseDest est un numero de Fax).
Le gain en utilisant une fonction scalaire lors du calcul a été intéressant.
Seulement voila. Si je souhaite filtrer sur le résultat de cette fonction dans une WHERE, j'ai un message du style:
Code:
1 2
|
Echec de la conversion de la valeur VARCHAR '00r' en type de donnée in. |
Code:
1 2 3 4 5 6 7
|
SELECT prod.CodeClient, TB_Zones.ZoneId, TB_Zones.Description, SUM(doc.Durée) AS DuréeFax
FROM TB_Prod AS prod INNER JOIN
TB_Doc AS doc ON prod.NomProd = doc.NomProd INNER JOIN
TB_Zones ON dbo.GetZoneFax(doc.AdresseDest) = TB_Zones.ZoneId
WHERE (prod.DateFin < '01/05/2010') AND (prod.DateFin > '01/04/2010') AND (TB_Zones.ZoneId = '01')
GROUP BY prod.CodeClient, TB_Zones.ZoneId, TB_Zones.Description |
Après de nombreuses vérification je n'ai aucun numéro de fax qui retourne '00r'.
Si je vire la clause de filtrage (TB_Zones.ZoneId = '01') la requête fonctionne.
Si j'utilise un HAVING pour garder juste les groupes avec la zone '01', j'obtiens le même problème.
Mon collègue et moi avons essayé diverses manière de réécrire la requête mais rien n'y fait.
Et plus bizarre si je met comme clause WHERE (TB_Zones.ZoneId <> '01'), le filtrage marche. Mais avec WHERE NOT (TB_Zones.ZoneId <> '01'), la requête refuse de fonctionner.
Faire un <> de toute les autres zones, donne le résultat attendu par contre.
Ce comportement est très bizarre.
Cordialement