Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

CORRIGER : Un résultat Incorrect lorsque vous exécutez une requête qui contient une conjonction et une disjonction dans SQL Server Compact 3.5

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

La version anglaise de cet article est la suivante: 2494715
Symptômes
Lorsque vous exécutez une requête sur une base de données Microsoft SQL Server Compact 3.5, un résultat incorrect est renvoyé. Ce problème se produit lorsque la requête contient une conjonction et une disjonction. Si nous supposons que les opérateurs sont ET et OR, la requête doit respecter les conditions spécifiques suivantes :
  • L'un des opérandes de la ET l'opérateur est une expression qui contient le OR opérateur.
  • Les opérandes de laORopérateur de contenir des expressions qui font référence à la même colonne. Par conséquent, un index de la colonne peut être utilisé pour faire correspondre les expressions.
  • L'autre opérande de le ETopérateur contient une référence à une colonne qui utilise le même index que la colonne est spécifiée dans la puce précédente dans cette liste. Par conséquent, l'index peut être également utilisé sur cette expression.
Par exemple, supposons que vous créez les tables suivantes utilisent des index dans une base de données SQL Server Compact 3.5.
CREATE TABLE T1( C1 int, C2 int)GOCREATE INDEX IND_T1 ON T1 (C1, C2)GOCREATE TABLE T2( C1 int, C2 int)GOCREATE INDEX IND_T2 ON T2 (C1, C2)GOINSERT INTO T1 VALUES (1, 0)GOINSERT INTO T1 VALUES (2, 0)GOINSERT INTO T2 VALUES (1, -1)GOINSERT INTO T2 VALUES (2, 0)GO
Ensuite, vous exécutez la requête suivante :
SELECT T1.C1 [T1.C1], T1.C2 [T1.C2], T2.C1 [T2.C1], T2.C2 [T2.C2]FROM T1 INNER JOIN T2 ONT1.C1 = T2.C1AND (T1.C2 = T2.C2 OR T2.C2 = -1)GO
Après avoir exécuté la requête, vous recevez un résultat incorrect suivant :
T1.C1T1.C2T2.C1T2.C2
2020
Cependant, vous attendez le résultat suivant :
T1.C1T1.C2T2.C1T2.C2
101-1
2020
RemarqueCe problème se produit également lorsque vous utilisez leclause pour effectuer une conjonction logique sur deux expressions. Par exemple, ce problème se produit également lorsque vous exécutez la requête suivante :
SELECT T1.C1 [T1.C1], T1.C2 [T1.C2], T2.C1 [T2.C1], T2.C2 [T2.C2]FROM T1 INNER JOIN T2 ONT1.C1 = T2.C1WHERE T1.C2 = T2.C2 OR T2.C2 = -1GO
Résolution
Le correctif qui résout ce problème est inclus dans le package de mise à jour cumulative 4 pour SQL Server Compact 3.5 Service Pack 2.

Pour plus d'informations sur la façon d'obtenir le package de mise à jour cumulative 4 pour SQL Server Compact 3.5 Service Pack 2, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
2516828 Mise à jour cumulative 4 pour SQL Server Compact 3.5 Service Pack 2
Contournement
Pour contourner ce problème, réécrivez la requête en utilisant l'une des méthodes suivantes :

Méthode 1

Utilisez les indicateurs de table dans la requête pour désactiver les index. Par exemple, exécutez la requête suivante pour désactiver l'index :
SELECT T1.C1 [T1.C1], T1.C2 [T1.C2], T2.C1 [T2.C1], T2.C2 [T2.C2]FROM T1 INNER JOIN T2 WITH (INDEX(0)) ONT1.C1 = T2.C1AND (T1.C2 = T2.C2 OR T2.C2 = -1)GO 

Méthode 2

Réécrire la requête afin d'éviter les conditions qui sont mentionnés dans la section « Symptômes » :
SELECT T1.C1 [T1.C1], T1.C2 [T1.C2], T2.C1 [T2.C1], T2.C2 [T2.C2]FROM T1 INNER JOIN T2 ON(T1.C1 = T2.C1 AND T2.C2 = -1) OR (T1.C1 = T2.C1 AND T1.C2 = T2.C2)
Statut
Microsoft a confirmé qu'il s'agit d'un problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 2494715 - Dernière mise à jour : 04/27/2011 09:18:00 - Révision : 2.0

  • kbfix kbqfe kbexpertiseadvanced kbsurveynew kbmt KB2494715 KbMtfr
Commentaires
html>