Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.