2010-04-20 11 views
10

Mam dwa pytania:Nie można rozwiązać konflikt sortowania w Unii wybrać

pierwsze nie działa:

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

ponieważ otrzymuję błąd:

Cannot resolve collation conflict for column 1 in SELECT statement. 

drugie działa:

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

Struktura:

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

DuplicatedObjects.duplicatetargetCode PK nvarchar(100) 
+1

Jakie jest znaczenie C# tutaj? –

+0

@John Skeet Poprawiłem to – user278618

Odpowiedz

9

Użyj sp_help na obu stołach. Sortowanie w hotels.TargetCode różni się od sortowania na DuplicatedObjects.duplicateTargetCode, więc DB nie wie, co zrobić z wynikiem UNION.

Można wymusić nowe sortowanie na jednym z nich, aby dopasować je do innego lub umieścić wyniki w predefiniowanej tabeli/tabeli temp, które będą już zdefiniowane w zestawieniu.

EDIT: Można zastąpić istniejący sortowania użyciu coś jak ...

DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS 

... w zapytaniu. Spowoduje to użycie duplikatuTargetCode z sortowaniem SQL_Latin1_General_CP1_CI_AS. Powinieneś wybrać zestawienie, które jest zgodne z hotels.TargetCode.

2

Próba ustawienia sortowania w zapytaniu, gdy dołączenie do połączonego serwera nadal może się nie powieść z Incorrect syntax near 'COLLATE', mimo że składnia jest poprawna.

Rozwiązanie: W oknie Właściwości połączonego serwera ustaw Use Remote Collation na False i wprowadź żądany typ sortowania w Collation Name - usuwa konieczność wymuszania sortowania w zapytaniu.

+0

Nie jest to zalecane bez testowania wydajności, ponieważ może drastycznie zmienić plan kwerend i prowadzić do dużo droższych kwerend w porównaniu do określania sortowania w zapytaniu. W jednym przypadku coś, co trwało 2 sekundy z sortowaniem określonym w zapytaniu, zajęło 2 minuty, gdy na połączonym serwerze określono sortowanie. – tukushan

14

Trzeba dodać oświadczenie w wybranej części collation a także - nie tylko w przypadkach, gdy klauzula - jak następuje:

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

Twój konflikt sortowania może odejść, jeśli deklarują #list tabeli temp jako

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 
) 
+0

Myślę, że to może ci pomóc –

Powiązane problemy