2010-04-20 2 views
10

У меня есть два запроса:не удается разрешить конфликт параметров сортировки в Союзе выбрать

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

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

В чем смысл C# здесь? –

+0

@John Skeet Я исправил его – user278618

ответ

9

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

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

EDIT: Вы можете изменить существующие параметры сортировки, используя что-то вроде ...

DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS 

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

2

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

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

+0

Это не рекомендуется без тестирования производительности, поскольку он может радикально изменить ваш план запросов и привести к гораздо более дорогостоящим запросам по сравнению с заданием сортировки в запросе. В одном случае что-то, что занимало 2 секунды с сопоставлением, указанным в запросе, заняло 2 минуты, когда сопоставление было указано на связанном сервере. – tukushan

14

Вы должны добавить collation заявление в избранной части, а также - не только в том, где положение - как следующее:

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

Ваш сверка конфликт может уйти, если вы объявляете температура таблицы #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 
) 
+0

Я думаю, что это может помочь вам –