Не удается разрешить конфликт сопоставления между «SQL_Latin1_General_CP1_CI_AS» и «Latin1_General_CI_AS» в операции равных - PullRequest
290 голосов
/ 22 октября 2009

У меня есть следующий код

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

При выполнении кода я получаю сообщение об ошибке, вставленное в заголовок после добавления двух объединений для таблицы C. Я думаю, что это может быть связано с тем фактом, что я использую SQL Server 2008 и восстановил копию этого ДБ на моей машине, которая 2005 года.

Ответы [ 23 ]

750 голосов
/ 22 октября 2009

Я делаю следующее:

...WHERE 
    fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT

Работает каждый раз. :)

280 голосов
/ 22 октября 2009

У вас несоответствие двух разных параметров сортировки в вашей таблице.Вы можете проверить, какие параметры сортировки имеет каждый столбец в ваших таблицах, с помощью этого запроса:

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

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

Как только выЕсли вы выбрали одно сопоставление, вы можете изменить те таблицы / столбцы, которые еще не соответствуют, с помощью этой команды:

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

Marc

UPDATE: найти полнотекстовые индексы в вашей базе данных, используйте этот запрос здесь:

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

Затем вы можете удалить полнотекстовый индекс, используя:

DROP FULLTEXT INDEX ON (tablename)
68 голосов
/ 22 октября 2009

Используйте в запросе предложение collate:

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

Возможно, у меня не совсем правильный синтаксис (проверьте BOL), но вы можете сделать это, чтобы оперативно изменять параметры сортировки для запроса - вам может понадобиться добавить условие для каждого соединения.

edit: я понял, что это было не совсем правильно - предложение сортировки идет после поля, которое нужно изменить - в этом примере я изменил сортировку в поле tA.oldValue.

26 голосов
/ 08 ноября 2014

Определите поля, для которых выдает эту ошибку, и добавьте к ним следующее: COLLATE DATABASE_DEFAULT

В поле Код объединены две таблицы:

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

Обновите ваш запрос до:

...
and table1.Code COLLATE DATABASE_DEFAULT = table2.Code COLLATE DATABASE_DEFAULT
...
11 голосов
/ 21 января 2016

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

...WHERE fieldname COLLATE DATABASE_DEFAULT in (
          SELECT DISTINCT otherfieldname COLLATE DATABASE_DEFAULT
          FROM ...
          WHERE ...
        )
10 голосов
/ 08 июня 2018

В критерии где добавить collate SQL_Latin1_General_CP1_CI_AS

Это работает для меня.

WHERE U.Fullname = @SearchTerm  collate SQL_Latin1_General_CP1_CI_AS
10 голосов
/ 03 февраля 2015

Это может легко случиться, когда у вас есть 2 разные базы данных и особенно 2 разные базы данных с 2 разных серверов. Лучший вариант - изменить его на общую коллекцию и выполнить объединение или сравнение.

SELECT 
   *
FROM sd
INNER JOIN pd ON sd.SCaseflowID COLLATE Latin1_General_CS_AS = pd.PDebt_code COLLATE Latin1_General_CS_AS
6 голосов
/ 22 октября 2009

Основная причина в том, что база данных сервера sql, из которой вы взяли схему, имеет параметры сортировки, которые отличаются от вашей локальной установки. Если вы не хотите беспокоиться о сопоставлении, переустановите SQL Server локально, используя то же сопоставление, что и база данных SQL Server 2008.

5 голосов
/ 15 декабря 2017
Ошибка

(не удается разрешить конфликт сортировки между ....) обычно возникает при сравнении данных из нескольких баз данных.

, поскольку теперь вы не можете изменить параметры сортировки баз данных, используйте COLLATE DATABASE_DEFAULT.

----------
AND db1.tbl1.fiel1 COLLATE DATABASE_DEFAULT =db2.tbl2.field2 COLLATE DATABASE_DEFAULT 
4 голосов
/ 22 октября 2009

У меня было что-то подобное раньше, и мы обнаружили, что сопоставление между двумя таблицами было разным.

Убедитесь, что они одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...