Kategorie szkoleń | Egzaminy | Kontakt

Odpowiedź (1)

  • 5

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();
  • Odpowiedział
  • @ | 22.04.2014
  • TRENER ALTKOM AKADEMII