Ich habe den folgenden Code
SELECT tA.FieldName As [Field Name],
COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
U.UserName AS [User Name],
CONVERT(varchar, tA.ChangeDate) AS [Change Date]
FROM D tA
JOIN
[DRTS].[dbo].[User] U
ON tA.UserID = U.UserID
LEFT JOIN
A tO_A
on tA.FieldName = 'AID'
AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
LEFT JOIN
A tN_A
on tA.FieldName = 'AID'
AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
LEFT JOIN
B tO_B
on tA.FieldName = 'BID'
AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
LEFT JOIN
B tN_B
on tA.FieldName = 'BID'
AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
LEFT JOIN
C tO_C
on tA.FieldName = 'CID'
AND tA.oldValue = tO_C.Name
LEFT JOIN
C tN_C
on tA.FieldName = 'CID'
AND tA.newValue = tN_C.Name
WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate
Beim Ausführen des Codes wird der Fehler nach dem Hinzufügen der beiden Verknüpfungen für Tabelle C in den Titel eingefügt. Ich denke, dies hat möglicherweise damit zu tun, dass ich SQL Server 2008 verwende und eine Kopie dieser Datenbank wiederhergestellt habe meine Maschine, die 2005 ist.
quelle
Ich mache folgendes:
Funktioniert jedes Mal. :) :)
quelle
Verwenden Sie die
collate
Klausel in Ihrer Abfrage:Möglicherweise ist die Syntax nicht genau richtig (überprüfen Sie BOL), aber Sie können dies tun, um die Sortierung für die Abfrage im laufenden Betrieb zu ändern. Möglicherweise müssen Sie die Klausel für jeden Join hinzufügen.
edit: Ich habe festgestellt, dass dies nicht ganz richtig ist - die Kollatierungsklausel folgt dem Feld, das Sie ändern müssen - in diesem Beispiel habe ich die Kollatierung im
tA.oldValue
Feld geändert .quelle
Identifizieren Sie die Felder, für die dieser Fehler ausgelöst wird, und fügen Sie Folgendes hinzu: COLLATE DATABASE_DEFAULT
Im Code-Feld sind zwei Tabellen verknüpft:
Aktualisieren Sie Ihre Anfrage auf:
quelle
Dies kann leicht passieren, wenn Sie 2 verschiedene Datenbanken und speziell 2 verschiedene Datenbanken von 2 verschiedenen Servern haben. Die beste Option ist, es in eine gemeinsame Sammlung zu ändern und den Join oder Vergleich durchzuführen.
quelle
@ Walküre tolle Antwort. Ich dachte, ich habe hier einen Fall eingefügt, wenn ich dasselbe mit einer Unterabfrage in einer gespeicherten Prozedur ausführe, da ich mich gefragt habe, ob Ihre Antwort in diesem Fall funktioniert, und es war großartig.
quelle
In den wo Kriterien hinzufügen
collate SQL_Latin1_General_CP1_CI_AS
Das funktioniert bei mir.
quelle
Die Hauptursache ist, dass die SQL Server-Datenbank, aus der Sie das Schema entnommen haben, eine Sortierung aufweist, die sich von Ihrer lokalen Installation unterscheidet. Wenn Sie sich keine Gedanken über die Sortierung machen möchten, installieren Sie SQL Server lokal mit derselben Sortierung wie die SQL Server 2008-Datenbank.
quelle
Beim Vergleichen von Daten aus mehreren Datenbanken tritt normalerweise ein Fehler auf (Kollatierungskonflikt zwischen ... kann nicht behoben werden).
Verwenden Sie COLLATE DATABASE_DEFAULT, da Sie die Sortierung von Datenbanken jetzt nicht ändern können.
quelle
Ich hatte so etwas schon einmal und wir fanden heraus, dass die Zusammenstellung zwischen zwei Tabellen unterschiedlich war.
Überprüfen Sie, ob diese gleich sind.
quelle
Dank der Antwort von marc_s habe ich mein ursprüngliches Problem gelöst - inspiriert, noch einen Schritt weiter zu gehen und einen Ansatz zur Transformation einer ganzen Tabelle gleichzeitig zu veröffentlichen - tsql-Skript, um die alter column-Anweisungen zu generieren:
erhält: ALTER TABLE Partner ALTER COLUMN myTable NVARCHAR (4000) COLLATE Latin1_General_CI_AS NOT NULL
Ich gebe zu, verwirrt zu sein über die Notwendigkeit, col.max_length / 2 -
quelle
Für diejenigen, die ein CREATE DATABASE-Skript (wie in meinem Fall) für die Datenbank haben, die dieses Problem verursacht, können Sie das folgende CREATE-Skript verwenden, um die Sortierung abzugleichen:
oder
Dies wendet die gewünschte Sortierung auf alle Tabellen an, was genau das war, was ich brauchte. Es ist ideal, die Sortierung für alle Datenbanken auf einem Server gleich zu halten. Hoffe das hilft.
Weitere Informationen finden Sie unter folgendem Link: SQL SERVER - Erstellen einer Datenbank mit unterschiedlicher Sortierung auf dem Server
quelle
Ich habe den Inhalt dieser Site verwendet , um das folgende Skript zu erstellen, das die Sortierung aller Spalten in allen Tabellen ändert:
quelle
Überprüfen Sie den Grad der nicht übereinstimmenden Sortierung (Server, Datenbank, Tabelle, Spalte, Zeichen).
Wenn es der Server ist, haben mir diese Schritte einmal geholfen:
Führen Sie diesen Befehl aus:
sqlservr -m -T4022 -T3659 -s"name_of_insance" -q "name_of_collation"
Starten Sie Ihren SQL Server:
net start name_of_instance
Überprüfen Sie die Sortierung Ihres Servers erneut.
Hier gibt es mehr Infos:
https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/
quelle
Wenn dies in Ihrer gesamten Datenbank auftritt, ist es besser, die DB-Sortierung wie folgt zu ändern:
Referenz hier
quelle
Code zu @ JustSteves Antwort hinzugefügt, um mit den Spalten varchar und varchar (MAX) umzugehen:
quelle
Um dieses Problem in der Abfrage zu beheben, ohne eine der Datenbanken zu ändern, können Sie die Ausdrücke auf der anderen Seite des Zeichens "=" mit umwandeln
wie hier vorgeschlagen .
quelle
Ich hatte einen ähnlichen Fehler (der Kollatierungskonflikt zwischen "SQL_Latin1_General_CP1_CI_AS" und "SQL_Latin1_General_CP1250_CI_AS" in der INTERSECT-Operation konnte nicht behoben werden), als ich den alten JDBC-Treiber verwendete.
Ich habe dieses Problem behoben, indem ich einen neuen Treiber von Microsoft oder dem Open-Source-Projekt jTDS heruntergeladen habe .
quelle
Folgendes haben wir getan: In unserer Situation muss eine Ad-hoc-Abfrage mit einer Datumsbeschränkung bei Bedarf ausgeführt werden, und die Abfrage wird in einer Tabelle definiert.
Unsere neue Abfrage muss Daten zwischen verschiedenen Datenbanken abgleichen und Daten aus beiden enthalten.
Es scheint, dass sich die COLLATION zwischen der Datenbank, die Daten aus dem iSeries / AS400-System importiert, und unserer Berichtsdatenbank unterscheidet - dies könnte an den spezifischen Datentypen liegen (z. B. griechische Akzente auf Namen usw.).
Also haben wir die folgende Join-Klausel verwendet:
quelle
Sie können dies leicht in 4 einfachen Schritten tun
quelle
quelle
Möglicherweise haben Sie keinerlei Kollatierungsprobleme in Ihrer Datenbank. Wenn Sie jedoch eine Kopie Ihrer Datenbank aus einer Sicherung auf einem Server mit einer anderen Kollatierung als dem Ursprung wiederherstellen und Ihr Code temporäre Tabellen erstellt, erben diese temporären Tabellen die Kollatierung von der Server und es würde Konflikte mit Ihrer Datenbank geben.
quelle
quelle
Ich hatte eine ähnliche Anforderung; Dokumentation meines Ansatzes hier für alle mit einem ähnlichen Szenario ...
Szenario
Lösung
Verwenden Sie den SQL Server-Schema-Vergleich (von SQL Server Data Tools / Visual Studio), um die Quelle (Neuinstallation) mit dem Ziel (die Datenbank mit ungültiger Sortierung) zu vergleichen.
In meinem Fall habe ich die beiden DBs direkt verglichen; Sie könnten jedoch über ein Projekt arbeiten, um die dazwischen liegenden Teile manuell zu optimieren ...
Object Types
Sie unter nur die Typen aus, an denen Sie interessiert sind (für mich war es nurViews
undTables
)General
Wählen Sie:DELETE
Ordner klicken und auswählenEXCLUDE
.CREATE
Objekte ausschließen (hier, da sie im Ziel nicht vorhanden sind, können sie dort nicht die falsche Sortierung haben; ob sie existieren sollten, ist eine Frage für ein anderes Thema).Update
, um die Änderungen zu verschiebenDies erfordert immer noch einige manuelle Anstrengungen (z. B. die Überprüfung, ob Sie nur die Sortierung beeinflussen) - es werden jedoch Abhängigkeiten für Sie behandelt.
Sie können auch ein Datenbankprojekt des gültigen Schemas behalten, sodass Sie eine universelle Vorlage für Ihre DBs verwenden können, wenn Sie mehr als 1 zum Aktualisieren haben, vorausgesetzt, alle Ziel-DBs sollten dasselbe Schema haben.
Sie können auch Suchen / Ersetzen für die Dateien in einem Datenbankprojekt verwenden, wenn Sie die Einstellungen dort massenhaft ändern möchten (z. B. können Sie das Projekt mithilfe des Schema-Vergleichs aus der ungültigen Datenbank erstellen, die Projektdateien ändern und dann die Quelle / das Ziel umschalten das Schema vergleichen, um Ihre Änderungen zurück in die DB zu übertragen).
quelle