Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment résoudre un conflit de classement dans une requête SQL Server ?

Vous pouvez résoudre le problème en forçant le classement utilisé dans une requête à être un classement particulier, par ex. SQL_Latin1_General_CP1_CI_AS ou DATABASE_DEFAULT . Par exemple :

SELECT MyColumn
FROM FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS

Dans la requête ci-dessus, a.MyID et b.YourID seraient des colonnes avec un type de données textuel. Utilisation de COLLATE forcera la requête à ignorer le classement par défaut sur la base de données et à utiliser à la place le classement fourni, dans ce cas SQL_Latin1_General_CP1_CI_AS .

Fondamentalement, ce qui se passe ici, c'est que chaque base de données a son propre classement qui "fournit des règles de tri, des propriétés de sensibilité à la casse et aux accents pour vos données" (de http://technet.microsoft.com/en-us/library/ms143726.aspx ) et s'applique aux colonnes avec des types de données textuels , par exemple. VARCHAR , CHAR , NVARCHAR , etc. Lorsque deux bases de données ont des collations différentes, vous ne pouvez pas comparer des colonnes de texte avec un opérateur comme égal (=) sans résoudre le conflit entre les deux collations disparates.