web-dev-qa-db-fra.com

Faire une jointure sur deux bases de données avec des classements différents sur SQL Server et obtenir une erreur

Je sais, je sais avec ce que j'ai écrit dans la question que je ne devrais pas être surpris. Mais ma situation fonctionne lentement sur un système de point de vente hérité et mon prédécesseur ne connaissait apparemment pas les jointures. Ainsi, lorsque j'ai consulté l'une des pages internes qui se charge pendant 60 secondes, j'ai constaté qu'il était assez rapide de réécrire ces 8 requêtes en une seule. requête avec la situation JOINs. Le problème est que, outre le fait de ne pas connaître les JOIN, il semble aussi avoir eu un fétiche pour plusieurs bases de données et la surprise, la surprise, ils utilisent différentes collations. Le fait est que nous utilisons tous les caractères latins "normaux" pour que les anglophones considèrent l'alphabet en entier et que tout cela ne sera plus utilisable dans quelques mois, un bandaid est tout ce dont j'ai besoin.

En résumé, j’ai besoin d’une méthode pour transformer un seul classement afin de pouvoir comparer deux champs à partir de deux bases de données.

L'erreur exacte est:

Impossible de résoudre le conflit de classement entre "SQL_Latin1_General_CP850_CI_AI" et "SQL_Latin1_General_CP1_CI_AS" dans l'opération égale à.

56
Andrew G. Johnson

Vous pouvez utiliser la clause collate dans une requête (je ne trouve pas mon exemple pour le moment, ma syntaxe est donc probablement fausse - j'espère que cela vous orientera 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
116
Ray

Un moyen générique consiste à contraindre le classement à DATABASE_DEFAULT. Cela supprime le codage en dur du nom de classement qui pourrait changer.

C'est également utile pour les tables temporaires et les variables de table, ainsi que pour les cas où vous ne connaissez peut-être pas le classement du serveur (par exemple, vous êtes un fournisseur plaçant votre 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
56
gbn