2010-02-18 4 views
54

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 n'était apparemment pas au courant des JOINs donc quand j'ai regardé dans l'une des pages internes qui charge pendant 60 secondes je vois que c'est assez rapide, réécrire ces 8 requêtes en une seule requête avec situation JOINs. Le problème est que, en plus de ne pas connaître les JOINs, il semble également avoir eu un fétiche pour plusieurs bases de données et de surprise, surprise qu'ils utilisent des collations différentes. Le fait est que nous utilisons tous les caractères latins «normaux» que les anglophones considéreraient comme l'alphabet entier et que tout cela sera hors d'usage dans quelques mois alors un pansement est tout ce dont j'ai besoin. En bref, j'ai besoin d'une sorte de méthode pour fusionner en un seul classement afin que je puisse comparer deux champs de deux bases de données.Faire une jointure entre deux bases de données avec différents classements sur SQL Server et obtenir une erreur

erreur exacte est:

ne peut pas résoudre le conflit de classement entre "SQL_Latin1_General_CP850_CI_AI" et " SQL_Latin1_General_CP1_CI_AS" dans la égale au fonctionnement.

Répondre

107

Vous pouvez utiliser la clause COLLATE dans une requête (je ne peux pas trouver mon exemple en ce moment, donc ma syntaxe est probablement mal - je l'espère vous pointe 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 
48

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

Il est également utile pour les variables de table temporaire et de table, et où vous savez peut-être pas le classement du serveur (par exemple, vous êtes un fournisseur de placer 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 
Questions connexes