it-swarm.com.de

Kollatierungskonflikt kann nicht gelöst werden

Ich habe eine unserer Datenbanken (DB1) von SQL Server 2008 nach 2012 verschoben und beim Ausführen der gespeicherten Prozeduren wird die folgende Fehlermeldung angezeigt

Der Kollatierungskonflikt zwischen "SQL_Latin1_General_CP1_CI_AS" und "Latin1_General_CI_AS" in der Operation "gleich" kann nicht aufgelöst werden

Ich habe die Sortierung in der Datenbank mit geändert

ALTER DATABASE [optimiser] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [optimiser] COLLATE SQL_Latin1_General_CP1_CI_AS
ALTER DATABASE [optimiser] SET MULTI_USER

Aber ich erhalte immer noch den Fehler, wenn die gespeicherten Prozeduren ausgeführt werden. Ich glaube, weil SP) einen Join zu einer anderen Datenbank verwendet (GE's ihistorian) und es eine Kollatierungsinkongruenz gibt. IS=), um dies zu beheben.

Auf dem alten Server wurde DB1 auf Latin1_General_CI_AS Gesetzt und dies funktioniert einwandfrei. Der neue Speicherort für die DB hat den Standardwert SQL_Latin1_General_CP1_CI_AS. Lohnt es sich, die Kollatierung n DB1 auf dem neuen Server wieder auf Latin1_General_CI_AS Zu ändern?

41
Silentbob

Kollatierungen haben zwar eine eigene Kollatierung, aber jede Tabelle und jede Spalte kann eine eigene Kollatierung haben. Wenn nicht angegeben, wird der Standardwert des übergeordneten Objekts verwendet, dieser kann jedoch unterschiedlich sein.

Wenn Sie die Sortierung der Datenbank ändern, wird diese für alle neuen Tabellen und Spalten als neue Standardeinstellung verwendet, die Sortierung der vorhandenen Objekte in der Datenbank wird jedoch nicht geändert. Sie müssen die Sortierung jeder Tabelle und Spalte manuell ändern.

Glücklicherweise gibt es im Internet Skripte, die die Arbeit erledigen können. Ich werde keine empfehlen, da ich sie nicht ausprobiert habe, aber hier sind einige Links:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

Sortierung aller Felder in der Datenbank sofort aktualisieren

http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx

Wenn Sie für zwei Objekte unterschiedliche Kollatierungen benötigen oder Kollatierungen nicht ändern können, können Sie dennoch JOIN zwischen den Objekten mit dem Befehl COLLATE und der Auswahl der Kollatierung, die Sie verbinden möchten, verwenden.

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE Latin1_General_CI_AS 

oder mit Standard-Datenbanksortierung:

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT
85
Nenad Zivkovic