58 votes

Joindre deux bases de données avec des collations différentes sur SQL Server et obtenir une erreur.

Je sais, je sais qu'avec ce que j'ai écrit dans la question, je ne devrais pas être surpris. Mais ma situation est la suivante : je travaille lentement sur un système de point de vente hérité et mon prédécesseur n'était apparemment pas au courant des JOINs. Lorsque j'ai regardé l'une des pages internes qui se charge pendant 60 secondes, j'ai vu qu'il s'agissait d'une situation assez rapide : réécrire ces 8 requêtes en une seule avec des JOINs. Le problème, c'est qu'en plus de ne pas connaître les JOIN, il semble aussi avoir un penchant pour les bases de données multiples et, surprise, surprise, elles utilisent des collations différentes. Le fait est que nous utilisons tous les caractères latins "normaux" que les anglophones considèrent comme l'alphabet entier et que tout cela sera inutilisable dans quelques mois, alors un pansement est tout ce dont j'ai besoin.

Pour faire court, j'ai besoin d'une méthode permettant d'extraire une collation unique afin de pouvoir comparer deux champs provenant de deux bases de données.

L'erreur exacte est :

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

119voto

Ray Points 12711

Vous pouvez utiliser la clause collate dans une requête (je ne trouve pas mon exemple pour le moment, donc ma syntaxe est probablement erronée - j'espère qu'elle vous oriente dans la bonne direction).

select sone_field collate SQL_Latin1_General_CP850_CI_AI
  from table_1
    inner join table_2
      on (table_1.field collate SQL_Latin1_General_CP850_CI_AI = table_2.field)
  where whatever

58voto

gbn Points 197263

Un moyen général est de forcer la collation à DATABASE_DEFAULT. Cela évite de coder en dur le nom de la collation qui pourrait changer.

C'est également utile pour les tables temporaires et les variables de table, et lorsque vous ne connaissez pas la collation du serveur (par exemple, si vous êtes un fournisseur qui place son système sur le serveur du client).

select
    sone_field collate DATABASE_DEFAULT
from
    table_1
    inner join
    table_2 on table_1.field collate DATABASE_DEFAULT = table_2.field
where whatever

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