SQL: Cannot resolve the collation conflict…

25-Lut-2018

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

 

Dodaj komentarz:

Autor: Rafał Kraik