2008-11-03 6 views
3

J'ai 2 bases de données à distance dans le cadre d'une requêterequête SQL Server contre deux bases de données liées en utilisant différents classements

select p.ID,p.ProjectCode_VC,p.Name_VC,v.* 
FROM [serverB].Projects.dbo.Projects_T p 
LEFT JOIN [serverA].SOCON.dbo.vw_PROJECT v on 
p.ProjectCode_VC = v.PROJ_CODE 

Le problème est que serverA utilise le classement Latin1_General_BIN et serverB utilise Latin1_General_CP1_CP_AS et la requête refuse d'exécuter .

Les deux serveurs sont des serveurs SQL 2000. Les deux bases de données sont gravées dans la pierre, donc je ne peux pas changer leurs collations, malheureusement.

De toute façon, vous savez comment faire fonctionner ça?

Mise à jour: J'ai trouvé une solution alternative. Dans les propriétés du serveur lié, vous pouvez spécifier le classement du serveur lié.

+0

Si les deux serveurs ont le même classement, vous pouvez définir la compatibilité de classement sur le serveur lié à « true » pour améliorer les performances. – super9

+0

Petit point découvert aujourd'hui: si vous forcez le classement du serveur lié, le moteur de requête risque de ne pas pouvoir utiliser les index distants et aura plutôt besoin de récupérer plus de données pour la comparaison/filtrage local! (par exemple, si vous voyez l'opérateur de plan de requête "Remote Scan", ceci est un signe potentiellement très mauvais) – Tao

Répondre

9

il suffit d'ajouter la collation à votre sélection, comme:

select 
    p.ID, 
    p.ProjectCode_VC, 
    p.Name_VC, 
    v.* 
FROM 
    [serverB].Projects.dbo.Projects_T p 
    LEFT JOIN [serverA].SOCON.dbo.vw_PROJECT v on p.ProjectCode_VC 
    collate Latin1_General_Bin = v.PROJ_CODE 

ou l'inverse. Donc "convertir" l'une des collations à l'autre.

2

Ou vous pouvez utiliser une requête plus générique comme ceci:

select * from profile, userinfo 
where profile.custid collate database_default = userinfo.custid collate database_default 
Questions connexes