12 Stimmen

Kollationierungskonflikt in Union select kann nicht aufgelöst werden

Ich habe zwei Fragen:

Erstens funktioniert es nicht:

select hotels.TargetCode as TargetCode from hotels
union all 
select DuplicatedObjects.duplicatetargetCode as TargetCode 
from DuplicatedObjects where DuplicatedObjects.objectType=4

weil ich einen Fehler erhalte:

Cannot resolve collation conflict for column 1 in SELECT statement.

Zweite Arbeiten:

select hotels.Code from hotels where hotels.targetcode is not null 
union all 
select DuplicatedObjects.duplicatetargetCode as Code 
from DuplicatedObjects where DuplicatedObjects.objectType=4 

Struktur:

Hotels.Code -PK nvarchar(40)
Hotels.TargetCode - nvarchar(100)

DuplicatedObjects.duplicatetargetCode PK nvarchar(100)

20voto

Jebu Punkte 335

Sie müssen die collation Anweisung auch im select-Teil - nicht nur in der where-Klausel - wie im Folgenden:

select a.field1 collate DATABASE_DEFAULT, b.otherfield from table1 a, table2 b 
where a.field1 collate DATABASE_DEFAULT = b.field3

11voto

Joel Goodwin Punkte 4866

Utilice sp_help auf beiden Tischen. Die Sortierung von hotels.TargetCode unterscheidet sich von der Sortierung von DuplicatedObjects.duplicateTargetCode so dass die DB nicht weiß, was sie mit den resultierenden Daten machen soll. UNION .

Sie können eine neue Sortierreihenfolge erzwingen, damit sie mit der anderen übereinstimmt, oder die Ergebnisse in eine vordefinierte temporäre Tabelle/Tabelle einfügen, für die bereits eine Sortierreihenfolge definiert ist.

EDIT : Sie können die vorhandene Sortierung überschreiben, indem Sie etwas wie...

DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS

...in der Abfrage. Dies verwendet den duplicateTargetCode mit der Sortierung SQL_Latin1_General_CP1_CI_AS . Sie sollten eine Sortierung wählen, die mit der von hotels.TargetCode .

4voto

Daniel de Zwaan Punkte 2918

Der Versuch, die Sortierung in einer Abfrage beim Beitritt zu einem verknüpften Server festzulegen, kann immer noch fehlschlagen mit Incorrect syntax near 'COLLATE' auch wenn Ihre Syntax korrekt ist.

Lösung: Setzen Sie in den Linked Server-Eigenschaften Use Remote Collation auf Falsch, und geben Sie die gewünschte Sortierart in Collation Name - entfernt, müssen Sie die Sortierung in Ihrer Abfrage erzwingen.

2voto

Rajnish Kumar Punkte 55

Ihr Kollationierungskonflikt kann verschwinden, wenn Sie die temporäre Tabelle #list als

 CREATE TABLE #list
 (
 record_num INT IDENTITY(1,1),
 TempAcctNum NVARCHAR(40) Collate Database_Default,
 TempAcctName NVARCHAR(100) Collate Database_Default,
 TempNumOfCrds SMALLINT,
 TempSys2Acct NVARCHAR(10) Collate Database_Default,
 TempDelType TINYINT,
 TempStatusOfCrd VARCHAR(100) Collate Database_Default,
 TempLastDate VARCHAR(100) Collate Database_Default,
 TempSys2Acct1 NVARCHAR(10) Collate Database_Default,
 TempShrtName NVARCHAR(50) Collate Database_Default,
 TempAdd1 NVARCHAR(200) Collate Database_Default,
 TempAdd2 NVARCHAR(200) Collate Database_Default,
 TempCity NVARCHAR(100) Collate Database_Default,
 TempState NVARCHAR(100) Collate Database_Default,
 TempZipCode NVARCHAR(50) Collate Database_Default,
 TempOpenDate DATETIME,
 TempFax NVARCHAR(50) Collate Database_Default,
 TempUsr1 NVARCHAR(100) Collate Database_Default,
 TempUsr2 NVARCHAR(100) Collate Database_Default,
 TempUsr3 NVARCHAR(100) Collate Database_Default,
 TempUsr4 NVARCHAR(100) Collate Database_Default,
 TempMemo NTEXT,
 TempMail NVARCHAR(100) Collate Database_Default,
 TempNoSys2Status NVARCHAR(50) Collate Database_Default,
 TempDelete BIT,
 TempEdit BIT,
 TempContName VARCHAR(200) Collate Database_Default,
 TempPhone NVARCHAR(50) Collate Database_Default
 )

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