Jak w temacie.
Jak w temacie.
Tabela tymczasowa nie posiada collation, bo właściwość collation dotyczy kolumn znakowych. Jeżeli w definicji utworzenia tabeli tymczasowej nie określimy jakie collation ma każda z kolumn znakowych (uwaga: to trzeba zdefiniować dla każdej kolumny osobno!), to odziedziczą collation po domyślnym colation dla bazy danych Tempdb, a nie po bazie danych użytkownika. Oznacza to, że jeżeli collation w bazie danych tempdb i bazie danych użytkownika są różne, a podczas tworzenia tabeli tymczasowej nie zadeklarujemy jakie collation mają mieć kolumny w tabeli, to nie będzie możliwość bezpośredniego porównania zawartości pól z tabel użytkownika oraz utworzonego obiektu tymczasowego. Aby wykonać takie porównanie należy jawnie zadeklarować zgodnie z jakim collation należy porównać zawartość pól z obu obiektów za pomocą dyrektywy COLLATE i nazwy collation jakie ma być użyte. Należy również pamiętać, że jeżeli nie zadeklarujemy jawnie dla każdej kolumny w tabeli tymczasowej collation, to może się okazać, że w jednej tabeli będziemy posiadać kolumny z różnym collation. Proszę wykonać prosty eksperyment:
-- tworzymy tabele tymczasowa, w jednej kolumnie jawnie deklarujemy collation, a w drugiej pozostawiamy domyslne CREATE TABLE #t1 ( Col1 nvarchar(10) COLLATE Latin1_General_CS_AS, Col2 nvarchar(10) ) -- dodajemy dane INSERT INTO #t1 VALUES (N'Altkom',N'Altkom') -- staramy sie wyszukac dodane rekordy SELECT * FROM #t1 WHERE Col1=Col2
jako rezultat zapytania otrzymujemy błąd:
Msg 468, Level 16, State 9, Line 19 Cannot resolve the collation conflict between "Polish_CI_AS" and "Latin1_General_CS_AS" in the equal to operation.
Aby porównać pola o różnym collation musimy jawnie zadeklarować jakie collation ma być użyte (może to być dowolne dostępne collation dostępne na serwerze):
SELECT * FROM #t1 WHERE Col1=Col2 COLLATE Latin1_General_CS_AS
Teraz otrzymamy poprawny rezultat zapytania.
Listę dostępnych collation można uzyskać w następujący sposób:
SELECT name, description FROM fn_helpcollations();