{"id":19,"date":"2006-07-04T17:18:15","date_gmt":"2006-07-04T15:18:15","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/?p=19"},"modified":"2006-07-04T17:18:15","modified_gmt":"2006-07-04T15:18:15","slug":"explicit-collations-in-cross-database-statements","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2006\/07\/04\/sql-talk\/explicit-collations-in-cross-database-statements","title":{"rendered":"explicit collations in cross database statements"},"content":{"rendered":"<p>Gestern hatten wir wieder den Fall, dass ein Lieferant in die Collation-Falle getappt ist. Sie legen eine tempor&#228;re Tabelle an und verjoinen sie mit einer Tabelle in deren Datenbank. Weil aber die TempDB (in der die tempor&#228;re Tabelle liegt) unter Umst&#228;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.<\/p>\n<p>Das f&#252;hrt zu dem bekannten Fehler:<\/p>\n<blockquote><p>Konflikt der Sortierung f&#252;r die concatenation-Operation kann nicht aufgel&#246;st werden.<\/p><\/blockquote>\n<p>Die L&#246;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&#252;r Vergleichsoperationen verwendet werden soll. Dann ist f&#252;r den SQL Server klar, wann die Zeichenketten &quot;gleich&quot;\/&quot;gr&#246;&#223;er&quot;\/&quot;kleiner&quot; sind. Wenn nicht, woher soll er wissen, anhand von welcher Collation er das festlegen soll?<\/p>\n<p>Die L&#246;sung im Falle von tempor&#228;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&#228;hlt, wie in seiner Anwendungsdatenbank, dann kann nichts schiefgehen:<\/p>\n<pre>create table #MyTempTab\r\n(id integer identity(1,1) primary key,\r\nname varchar(200) COLLATE Latin1_General_CI_AS, ...)<\/pre>\n<p>Das gilt &#252;brigens auch f&#252;r Table-Variablen, weil auch sie in der TempDB gespeichert werden:<\/p>\n<pre>declare @MyTableVar table\r\n(id integer identity (1,1),\r\nname varchar(200) COLLATE SQL_Latin1_General_Pref_CP1_CI_AS)<\/pre>\n<p>Eine andere M&#246;glichkeit f&#252;r das Anlegen der tempor&#228;ren Tabelle ist einfach SELECT INTO zu verwenden, auch dann wird die Collation der Quell-Attribute beibehalten.<\/p>\n<pre>select id, name\r\ninto #mytemptable\r\nfrom Me.MyTestTable<\/pre>\n<p>Weitere Hinweise stehen in der Online-Hilfe des SQL Servers unter &quot;<a target=\"_blank\" title=\"Transact-SQL Reference | Collate\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms184391.aspx\">Transact-SQL Reference | Collate<\/a>&quot; und &quot;<a target=\"_blank\" title=\"Transact-SQL Reference |Collation Precedence\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms179886.aspx\">Transact-SQL Reference |Collation Precedence<\/a>&quot;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gestern hatten wir wieder den Fall, dass ein Lieferant in die Collation-Falle getappt ist. Sie legen eine tempor&#228;re Tabelle an und verjoinen sie mit einer Tabelle in deren Datenbank. Weil aber die TempDB (in der die tempor&#228;re Tabelle liegt) unter Umst&#228;nden eine andere Default Collation hat als die Anwendungsdatenbank und bei den Create Table-Statement nichts [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/19"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=19"}],"version-history":[{"count":0,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/19\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=19"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=19"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=19"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}