Gestern hatten wir wieder den Fall, dass ein Lieferant in die Collation-Falle getappt ist. Sie legen eine temporäre Tabelle an und verjoinen sie mit einer Tabelle in deren Datenbank. Weil aber die TempDB (in der die temporäre Tabelle liegt) unter Umständen eine andere Default Collation hat als die Anwendungsdatenbank und bei den Create Table-Statement nichts weiter angegeben wurde, haben die Varchar-Felder der Tabellen potentiell unterschiedliche Collations.
Das führt zu dem bekannten Fehler:
Konflikt der Sortierung für die concatenation-Operation kann nicht aufgelöst werden.
Die Lösung ist ganz einfach und sollte generell eingesetzt werden, wenn man Software auf SQL Servern betreibt, die man sich mit anderen Anwendungen teilt: Man muss bei allen Operationen mit Char/Varchar/nchar/nvarchar-Typen explizit angeben welche Collation für Vergleichsoperationen verwendet werden soll. Dann ist für den SQL Server klar, wann die Zeichenketten "gleich"/"größer"/"kleiner" sind. Wenn nicht, woher soll er wissen, anhand von welcher Collation er das festlegen soll?
Die Lösung im Falle von temporären Tabellen ist noch einfacher: Es reicht wenn man beim Anlegen der Tabellen von Char/Varchar/nchar/nvarchar-Typen explizit angibt, welche Collation verwendet werden soll. Wenn man hier die gleiche Collation wählt, wie in seiner Anwendungsdatenbank, dann kann nichts schiefgehen:
create table #MyTempTab
(id integer identity(1,1) primary key,
name varchar(200) COLLATE Latin1_General_CI_AS, ...)
Das gilt übrigens auch für Table-Variablen, weil auch sie in der TempDB gespeichert werden:
declare @MyTableVar table
(id integer identity (1,1),
name varchar(200) COLLATE SQL_Latin1_General_Pref_CP1_CI_AS)
Eine andere Möglichkeit für das Anlegen der temporären Tabelle ist einfach SELECT INTO zu verwenden, auch dann wird die Collation der Quell-Attribute beibehalten.
select id, name
into #mytemptable
from Me.MyTestTable
Weitere Hinweise stehen in der Online-Hilfe des SQL Servers unter "Transact-SQL Reference | Collate" und "Transact-SQL Reference |Collation Precedence".