476 Stimmen

Der Kollationierungskonflikt zwischen "SQL_Latin1_General_CP1_CI_AS" und "Latin1_General_CI_AS" kann bei der Operation "Gleich" nicht aufgelöst werden

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 erhalte ich den im Titel eingefügten Fehler, nachdem ich die beiden Verknüpfungen für Tabelle C hinzugefügt habe. Ich denke, dass dies etwas mit der Tatsache zu tun haben kann, dass ich SQL Server 2008 verwende und eine Kopie dieser Datenbank auf meinem Computer, der 2005 ist, wiederhergestellt habe.

1124voto

Valkyrie Punkte 10745

Ich tue Folgendes:

...WHERE 
    fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT

Funktioniert jedes Mal :)

363voto

marc_s Punkte 701497

In Ihrer Tabelle stimmen zwei verschiedene Sortierungen nicht überein. Mit dieser Abfrage können Sie prüfen, welche Sortierreihenfolge die einzelnen Spalten Ihrer Tabelle(n) haben:

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

Kollationen werden benötigt und verwendet, um Zeichenketten zu ordnen und zu vergleichen. Im Allgemeinen ist es eine gute Idee, eine einzige, eindeutige Sortierreihenfolge in der gesamten Datenbank zu verwenden - verwenden Sie keine unterschiedlichen Sortierreihenfolgen innerhalb einer einzelnen Tabelle oder Datenbank - das würde nur zu Problemen führen....

Sobald Sie sich für eine einzige Sortierung entschieden haben, können Sie die Tabellen/Spalten, die noch nicht übereinstimmen, mit diesem Befehl ändern:

ALTER TABLE YourTableName
  ALTER COLUMN OffendingColumn
    VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

Marc

UPDATE: Um die Volltextindizes in Ihrer Datenbank zu finden, verwenden Sie diese Abfrage hier:

SELECT
    fti.object_Id,
    OBJECT_NAME(fti.object_id) 'Fulltext index',
    fti.is_enabled,
    i.name 'Index name',
    OBJECT_NAME(i.object_id) 'Table name'
FROM 
    sys.fulltext_indexes fti
INNER JOIN 
    sys.indexes i ON fti.unique_index_id = i.index_id

Sie können dann den Volltextindex mit löschen:

DROP FULLTEXT INDEX ON (tablename)

95voto

Ray Punkte 21047

Verwenden Sie die collate Klausel in Ihrer Abfrage:

LEFT JOIN C tO_C on tA.FieldName = 'CID' AND tA.oldValue COLLATE Latin1_General_CI_AS = tO_C.Name  

Möglicherweise ist die Syntax nicht ganz richtig (siehe BOL), aber Sie können die Sortierung für die Abfrage on-the-fly ändern - möglicherweise müssen Sie die Klausel für jede Verknüpfung hinzufügen.

Bearbeiten: Ich habe festgestellt, dass dies nicht ganz richtig war - die Sortierklausel kommt nach dem Feld, das Sie ändern müssen - in diesem Beispiel änderte ich die Sortierung im Feld tA.oldValue Feld.

48voto

Palak.Maheria Punkte 1419

Identifizieren Sie die Felder, bei denen dieser Fehler auftritt, und fügen Sie ihnen Folgendes hinzu: COLLATE DATABASE_DEFAULT

Es gibt zwei Tabellen, die über das Feld Code verbunden sind:

...
and table1.Code = table2.Code
...

Aktualisieren Sie Ihre Anfrage auf:

...
and table1.Code COLLATE DATABASE_DEFAULT = table2.Code COLLATE DATABASE_DEFAULT
...

35voto

Buzzzzzzz Punkte 874

Dies kann leicht passieren, wenn Sie 2 verschiedene Datenbanken und vor allem 2 verschiedene Datenbanken von 2 verschiedenen Servern haben. Die beste Option ist, sie in eine gemeinsame Sammlung zu ändern und die Verknüpfung oder den Vergleich durchzuführen.

SELECT 
   *
FROM sd
INNER JOIN pd ON sd.SCaseflowID COLLATE Latin1_General_CS_AS = pd.PDebt_code COLLATE Latin1_General_CS_AS

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X