Zdarza się i to szczególnie wtedy, kiedy baza danych ma inne collation niż serwer/instancja SQL, że wykonywanie zapytania pobierającego dane z jednej bazy i porównującego te dane z danymi z innej bazy, że zapytanie kończy się błędem:
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Polish_CI_AS" in the equal to operation.
Collation to parametr zarówno instancji, jak i bazy, jak i każdej kolumny tekstowej jak i nawet poszczególnych zapytań, który określa jak dane są sortowane. Np. można rozróżniać duże i małe litery lub nie. Collation, które rozróżnia wielkość liter ma w nazwie CS (Case Sensitive), a to collation, które nie rozróżnia ma w nazwie CI (Case Insensitive). Collation odpowiada też regułom sortowania zdefiniowanym dla poszczególnych języków, stąd mamy collation angielskie, polskie, chińskie itd.
Załóżmy, że collation bazy to SQL_Latin1_General_CP1_CI_AS. Dodatkowo utworzę tabelę w bazie danych tempdb z innym collation i wykonam zapytanie łączące tabele za pomocą polecenia JOIN:
CREATE TABLE #tab_PL (name nvarchar(10) COLLATE Polish_CI_AS ) CREATE TABLE #tab_Server (name nvarchar(10)) SELECT * FROM #tab_PL t1 JOIN #tab_Server t2 ON t1.name = t2.name
Dostaję tu bład:
Cannot resolve the collation conflict between „SQL_Latin1_General_CP1_CI_AS” and „Polish_CI_AS” in the equal to operation.
Problem można rozwiązać wskazując jakie collation ma być używane podczas wykonywania porównań w klauzuli ON.
Albo wskażesz konkretne collation jakie ma być wykorzystane:
SELECT * FROM #tab_PL t1 JOIN #tab_Server t2 ON t1.name = t2.name COLLATE Polish_CI_AS
Albo powiesz – używaj collation takiego jakie jest w bazie:
SELECT * FROM #tab_PL t1 JOIN #tab_Server t2 ON t1.name = t2.name COLLATE DATABASE_DEFAULT
Komentarze:
Witam.
Bardzo dziękuję z tę wskazówkę.
Po migracji bazy na nowy serwer pojawił się problem z „SQL_Latin1_General_CP1_CI_AS” and „Polish_CI_AS” . Życie mi Pan uratował 😉
Pozdrawiam.
Dziękuję bardzo za wskazówkę 🙂