Spiria logo.
Anthony Giretti
dans «  Applications web  »,
22 août 2016.

SQL Server : résoudre les erreurs de conflit de collations

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 :

decorative

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.

 

Partager l’article :