SQL Server : résoudre les erreurs de conflit de collations
![](/site/assets/files/1611/grey_image_blog-1.webp?v=1711557869)
Dans Microsoft SQL Server, une collation peut être attribuée au niveau de la colonne. Quand vous comparez (ou concaténez) deux colonnes de collations différentes, cette erreur de conflit apparait :
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "French_CI_AS" in the equal to operation.
—
Comment connaître la collation utilisée par une colonne ?
Entrez cette requête :
SELECT SO.NAME AS "Table Name", SC.NAME AS "Column Name", SC.collation AS "Collation" FROM dbo.sysobjects SO INNER JOIN dbo.syscolumns SC ON SO.id = SC.id LEFT JOIN dbo.syscomments SM ON SC.cdefault = SM.id WHERE SO.xtype = 'U' and SC.NAME = 'ColumnName' ORDER BY SO.[name], SC.colid
—
Solution 1 : corriger la requête
Exemple 1:
SELECT T1.*, T2.* FROM Table1 T1, Table2 T2 WHERE T1.Col1 = T2.Col2
Exemple 1 corrigé :
SELECT T1.*, T2.* FROM Table1 T1, Table2 T2 WHERE T1.Col1 COLLATE DATABASE_DEFAULT = T2.Col2 COLLATE DATABASE_DEFAULT
Exemple 2 :
SELECT T1.*, T2.* FROM Table1 T1 INNER JOIN Table2 T2 ON T1.Col1 = T2.Col2
Exemple 2 corrigé :
SELECT T1.*, T2.* FROM Table1 T1 INNER JOIN Table2 T2 ON T1.Col1 COLLATE DATABASE_DEFAULT = T2.Col2 COLLATE DATABASE_DEFAULT
Exemple 3:
SELECT T1.Name + T2.Name FROM Table1 T1 INNER JOIN Table2 T2 ON T1.Id = T2.Id
Exemple 3 corrigé :
SELECT T1.Name COLLATE DATABASE_DEFAULT + T2.Name COLLATE DATABASE_DEFAULT FROM Table1 T1 INNER JOIN Table2 T2 ON T1.Id = T2.Id
Comme on peut voir, les collations peuvent perturber une requête : dans une concaténation, dans une clause SELECT, dans une comparaison avec WHERE et dans une clause JOIN.
—
Solution 2 : changer la collation d’une des deux colonnes
Requête :
ALTER TABLE T1 ALTER COLUMN Col1 COLLATE SQL_Latin1_General_CP1_CI_AS
(Ou DATABASE_DEFAULT par exemple.)
L’objectif dans cette solution est d’harmoniser les collations.