ytmfb Geschrieben 16. Oktober 2014 Geschrieben 16. Oktober 2014 Hallo, ich soll in MSSQL ein Select erstellen das Daten von 2 verschiedenen Datenbanken miteinander verknüpft und bekomme folgende Fehlermeldung: Ein Sortierungskonflikt zwischen "SQL_Latin1_General_CP1_CI_AS" und "Latin1_General_CI_AS" im equal to-Vorgang kann nicht aufgelöst werden. Hab mir angelesen das man das Charset ändern muss, hat das schon mal jemand gemacht? Kann das Auswirkungen auf die Datenbank haben in Form von Folgen oder unerwünschten Effekten? Bin in Sachen Datenbanken Anfänger ( 2.LJ Ausbildung ) und würde mich über ein wenig Hilfe freuen. Gruß YTMFB Zitieren
RipperFox Geschrieben 16. Oktober 2014 Geschrieben 16. Oktober 2014 Das Problem hat man öfter mit Daten aus anderssprachigen Systemen oder auch alten SQL-Server Datenbanken. Die Sortierung der zu joinenden Spalten muss übereinstimmen/dem Server mitgeteilt werden. Es gibt meist mehrere Stellen, an denen man eine (Standard-)Sortierung (Collation) einstellen kann - afair pro Server, Datenbank und Spalte. Ändern geht generell per ALTER TABLE Anweisung - siehe Collation and Unicode Support Bsp: ALTER TABLE foo ALTER COLUMN bar char(8) COLLATE SQL_Latin1_General_CP1_CI_AS ALTER TABLE bla ALTER COLUMN blub char(8) COLLATE Latin1_General_CI_AS Wenn man die Standard-Collation der Datenbank nehmen möchte kann man auch "DATABASE_DEFAULT" statt z.B. "Latin1_General_CI_AS" schreiben. Alternativ zum Ändern der Tabelle kann man z.B. beim JOIN auch mittels COLLATE direkt angeben, wie man die Spalten behandeln möchte: Ein "kleines" Beispiel (ist doch länger geworden): --drop table #foo --drop table #bla -- Wir legen zwei Tabellen an: CREATE TABLE #foo (bar char(8)) CREATE TABLE #bla (blub char(8)) -- Setzen die Spalten auf unterschiedliche Sortierung: ALTER TABLE #foo ALTER COLUMN bar char(8) COLLATE SQL_Latin1_General_CP1_CI_AS ALTER TABLE #bla ALTER COLUMN blub char(8) COLLATE Latin1_General_CI_AS -- Und fügen ein paar Werte ein: INSERT INTO #foo (bar) VALUES ('1'), ('2'), ('3'), ('ss') INSERT INTO #bla (blub) VALUES ('1'), ('2'), ('3'), ('ß') -- Und fragen ab: --SELECT #foo.bar, #bla.blub FROM #foo --INNER JOIN #bla ON #foo.bar = #bla.blub -- Auskommentiert, würde fehlschlagen wegen unterschiedlicher Sortierung SELECT #foo.bar, #bla.blub FROM #foo INNER JOIN #bla ON #foo.bar = #bla.blub COLLATE SQL_Latin1_General_CP1_CI_AS -- SQL_Latin1_General_CP1_CI_AS behandelt ss und ß unterschiedlich -> kein Treffer beim Join bei den letzten Zeilen! SELECT #foo.bar, #bla.blub FROM #foo INNER JOIN #bla ON #foo.bar = #bla.blub COLLATE Latin1_General_CI_AS -- 'ss' und 'ß' sind hier gleichwertig! Man beachte, dass in dem Beispiel die Collation Latin1_General_CI_AS bei CHAR keinen Unterschied zwischen 'ss' und 'ß' macht - bei NCHAR würde es wieder anders aussehen.. In anderen Sprachen gibt's noch viel mehr Spass mit Sortierungen Man sollte sich die Sache mit den Sortierungen wirklich mal zu Gemüte führen und zumindest ansatzweise verstehen, was im Hintergrund passiert - wäre eigentlich Stoff für die Berufsschule.. Grüße Sascha Zitieren
ytmfb Geschrieben 20. Oktober 2014 Autor Geschrieben 20. Oktober 2014 Vielen dank, die Lösung mit dem Casten ist für mich relevant gewesen, da ich alter mit meiner Berechtigungsstufe nicht anwenden darf. Gruß YTMFB Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.