Не удается разрешить конфликт сортировки в Union select - PullRequest
10 голосов
/ 20 апреля 2010

У меня есть два запроса:

Первый не работает:

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

потому что я получаю ошибку:

Cannot resolve collation conflict for column 1 in SELECT statement.

Вторые работы:

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

Структура:

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

DuplicatedObjects.duplicatetargetCode PK nvarchar(100)

Ответы [ 4 ]

16 голосов
/ 26 ноября 2012

Вам необходимо добавить оператор collation также в выделенную часть - не только в предложение where - как показано ниже:

select a.field1 collate DATABASE_DEFAULT, b.otherfield from table1 a, table2 b 
where a.field1 collate DATABASE_DEFAULT = b.field3
9 голосов
/ 20 апреля 2010

Используйте sp_help для обеих таблиц. Параметры сортировки для отелей. TargetCode отличается от параметров сортировки для DuplicatedObjects.duplicateTargetCode, поэтому БД не знает, что делать с полученным значением UNION.

.

Вы можете принудительно установить новое сопоставление для одного из них, чтобы оно соответствовало другому, или поместить результаты в предварительно определенную временную таблицу / таблицу, для которой уже будет определено сопоставление.

РЕДАКТИРОВАТЬ: Вы можете переопределить существующую сортировку, используя что-то вроде ...

DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS

... в запросе. Это будет использовать duplicateTargetCode с сопоставлением SQL_Latin1_General_CP1_CI_AS. Вы должны выбрать параметры сортировки, которые соответствуют hotels.TargetCode.

2 голосов
/ 06 сентября 2012

Попытка установить параметры сортировки в запросе при присоединении к связанному серверу может все же завершиться неудачей с Incorrect syntax near 'COLLATE', даже если ваш синтаксис правильный.

Решение: в свойствах связанного сервера установите Use Remote Collation на False и введите требуемый тип сортировки в Collation Name - устраняет необходимость принудительной сортировки в запросе.

0 голосов
/ 06 января 2016

Ваш конфликт сопоставления может исчезнуть, если вы объявите временную таблицу #list как

 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
 ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...