Penso che tutti quelli che abbiamo iniziato a lavorare con SQL Server 7, quando poi sono passati alla versione 2000 abbiano avuto a che fare con il seguente fastidioso errore
Cannot resolve collation conflict for equal to operation.
L’errore deriva dal fatto che dalla versione 2000 è stato introdotto in SQL Server il concetto di Collation, ovvero un set di caratteri che facilita la gestione dei dati per i diversi linguaggi. tutto ciò che ha a che fare con i confronti tra caratteri (campi di tipo char e varchar) è soggetta alle regole imposte dalla collation. Ogni campo di tipo carattere ha un suo collation.
Di fatto si incorre in questo errore quando si cerca di confrontare due campi che hanno diverso collation e quindi SQL Server non riesce a decidere l’esito del confronto.
Questo accade soprattutto quando si confrontano dati da ambienti diversi o da db nati inizialmente con la versione 7 di SQL Server. Infatti la maggior parte dei casi riguarda confronti di campi con collate SQL_Latin1_General_CP1_CI_AS (il default di quando si importa un db da SQL Server 7) e Latin1_General_CI_AS (il default di quando si installa SQL Server 2000). Bisogna fare molta attenzione, sempre che siano necessarie join tra campi di tipo testo.
La soluzione
Per ovviare a questo errore è necessario fare un cast (la conversione) di uno dei campi Supponiamo di avere la tab1 con il campo c1 di tipo char(2) e collation SQL_Latin1_General_CP1_CI_AS, e la tabella tab2 con il campo c2 di tipo char(2) e collation Latin1_General_CI_AS, la query seguente
select * from tab1 join tab2 on tab1.c1 = tab2.c2
inevitabilmente restituirà il famoso errore, mentre
select * from tab1 join tab2 on CAST(tab1.c1 as char(2)) collate Latin1_General_CI_AS = tab2.c2
permette di far funzionare la join. E’ chiaro che eventuali indici sul campo c1 della tabella tab1 andranno a farsi benedire però almeno si risolve il problema.
Di fatto le join su campo di tipo stringa è il caso di non farli, gli id devono essere di tipo numerico, questo risolverebbe il problema alla base.