407 votes

Impossible de résoudre le conflit de collation entre "SQL_Latin1_General_CP1_CI_AS" et "Latin1_General_CI_AS" dans l'opération "equal to".

J'ai le code suivant

SELECT tA.FieldName As [Field Name],
       COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
       COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
       U.UserName AS [User Name],
       CONVERT(varchar, tA.ChangeDate) AS [Change Date] 
  FROM D tA
       JOIN 
       [DRTS].[dbo].[User] U 
         ON tA.UserID = U.UserID
       LEFT JOIN 
       A tO_A 
         on tA.FieldName = 'AID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
       LEFT JOIN 
       A tN_A 
         on tA.FieldName = 'AID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
       LEFT JOIN 
       B tO_B 
         on tA.FieldName = 'BID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
       LEFT JOIN 
       B tN_B 
         on tA.FieldName = 'BID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
       LEFT JOIN 
       C tO_C 
         on tA.FieldName = 'CID' 
        AND tA.oldValue = tO_C.Name
       LEFT JOIN 
       C tN_C 
         on tA.FieldName = 'CID' 
        AND tA.newValue = tN_C.Name
 WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate

Lorsque j'exécute le code, j'obtiens l'erreur collée dans le titre après avoir ajouté les deux jointures pour la table C. Je pense que cela peut avoir quelque chose à voir avec le fait que j'utilise SQL Server 2008 et que j'ai restauré une copie de cette base de données sur ma machine qui est 2005.

987voto

Valkyrie Points 2021

Je fais ce qui suit :

...WHERE 
    fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT

Ça marche à chaque fois. :)

88 votes

C'est l'un des postes les plus utiles sur SO

2 votes

J'ai utilisé cette solution parce que je travaillais avec deux anciens systèmes utilisant la même base de données et que je n'étais pas sûr que le fait de changer la collation des tables puisse interrompre la fonctionnalité.

5 votes

Si les deux mêmes champs sont utilisés ensemble à d'autres endroits (comparaisons, unions, coalesce, etc...), assurez-vous que la collation est également spécifiée pour chacun d'entre eux.

340voto

marc_s Points 321990

Vous avez un décalage de deux collations différentes dans votre table. Vous pouvez vérifier les collations de chaque colonne de votre ou vos tables en utilisant cette requête :

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

Les collations sont nécessaires et utilisées pour ordonner et comparer les chaînes de caractères. Il est généralement préférable d'utiliser une seule et unique collation dans l'ensemble de votre base de données. N'utilisez pas de collations différentes dans une même table ou base de données, car vous risquez de vous tromper. .....

Une fois que vous avez choisi une seule collation, vous pouvez modifier les tables/colonnes qui ne correspondent pas encore en utilisant cette commande :

ALTER TABLE YourTableName
  ALTER COLUMN OffendingColumn
    VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

Marc

MISE À JOUR : pour trouver les index en texte intégral dans votre base de données, utilisez cette requête ici :

SELECT
    fti.object_Id,
    OBJECT_NAME(fti.object_id) 'Fulltext index',
    fti.is_enabled,
    i.name 'Index name',
    OBJECT_NAME(i.object_id) 'Table name'
FROM 
    sys.fulltext_indexes fti
INNER JOIN 
    sys.indexes i ON fti.unique_index_id = i.index_id

Vous pouvez ensuite abandonner l'index plein texte en utilisant :

DROP FULLTEXT INDEX ON (tablename)

0 votes

Merci marc, c'est exactement le type de chose que je cherchais, une des tables avait une collation différente pour une raison stupide ! Je vais essayer de passer en collation standard et voir ce qui se passe.

0 votes

Marc, je reçois ça maintenant : Impossible de modifier ou de supprimer une colonne car elle est activée pour la recherche en texte intégral.

1 votes

Dans ce cas, vous devez temporairement supprimer l'index plein texte de cette table, modifier la collation, puis recréer l'index plein texte.

88voto

Ray Points 12711

Utilisez le collate dans votre requête :

LEFT JOIN C tO_C on tA.FieldName = 'CID' AND tA.oldValue COLLATE Latin1_General_CI_AS = tO_C.Name  

La syntaxe n'est peut-être pas tout à fait correcte (consultez le BOL), mais vous pouvez modifier la collation à la volée pour la requête - vous devrez peut-être ajouter la clause pour chaque jointure.

edit : J'ai réalisé que ce n'était pas tout à fait correct - la clause de collationnement va après le champ que vous devez modifier - dans cet exemple, j'ai changé la collation sur le champ tA.oldValue champ.

6voto

Robert Points 1119

La cause principale est que la base de données du serveur SQL dont vous avez extrait le schéma a une collation qui diffère de votre installation locale. Si vous ne voulez pas vous soucier de la collation, installez à nouveau SQL Server localement en utilisant la même collation que la base de données SQL Server 2008.

0 votes

J'ai eu le même problème, vous devez d'abord vérifier les propriétés de votre serveur et de votre base de données pour voir si elles ont la même collation.

4voto

astander Points 83138

J'ai eu quelque chose comme ça auparavant, et ce que nous avons trouvé, c'est que la collation entre 2 tables était différente.

Vérifiez que ce sont les mêmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X