Подтвердить что ты не робот

Как избавиться от конфликта сортировки в запросе SQL Server?

Я работаю над представлением, в котором я использую внутреннее соединение на двух таблицах, которые состоят из двух разных серверов. Мы используем связанный сервер. При выполнении запроса я получаю это сообщение:

Невозможно разрешить конфликт сортировки между "SQL_Latin1_General_CP1_CI_AS" и "Arabic_CI_AS" в равном действию.

Я мало знаю о сортировке. Поиск через интернет Я нахожу решения для использования COLLATE, но концепция COLLATE мне не понятна. Будет ли это что-то менять для любой из баз данных? Я ищу решение, не изменяя ничего для баз данных.

Приветствуем любой хороший учебный материал для этих концепций.

4b9b3361

Ответ 1

Вы можете решить проблему, заставив сортировку, используемую в запросе, для конкретной сортировки, например. SQL_Latin1_General_CP1_CI_AS или DATABASE_DEFAULT. Например:

SELECT MyColumn
FROM FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS

В вышеприведенном запросе a.MyID и b.YourID будут столбцами с текстовым типом данных. Использование COLLATE заставит запрос игнорировать сортировку по умолчанию в базе данных и вместо этого использовать предоставленную сортировку, в данном случае SQL_Latin1_General_CP1_CI_AS.

В основном, что происходит здесь, так это то, что каждая база данных имеет свою собственную сортировку, которая "предоставляет правила сортировки, свойства case и accent для ваших данных" (из http://technet.microsoft.com/en-us/library/ms143726.aspx) и применяется к столбцам с текстовыми типами данных, например VARCHAR, CHAR, NVARCHAR и т.д. Когда две базы данных имеют разные сортировки, вы не можете сравнивать текстовые столбцы с оператором типа equals (=), не обращаясь к конфликту между двумя разрозненными сопоставлениями.

Ответ 2

Я разрешил подобную проблему, обернув запрос в другой запрос...

В начальном запросе находилась рабочая находка, дающая отдельные столбцы вывода, причем некоторые из столбцов поступают из подзапросов с помощью функции Max или Sum, а другие - с "отличными" или заменой случаев и т.д.

Я столкнулся с ошибкой сортировки после попытки создать одно поле вывода с...

select
rtrim(field1)+','+rtrim(field2)+','+...

Запрос будет выполняться по мере того, как я его написал, но ошибка возникла после сохранения sql и перезагрузки.

Устранило его с чем-то вроде...

select z.field1+','+z.field2+','+... as OUTPUT_REC
from (select rtrim(field1), rtrim(field2), ... ) z

Некоторые поля являются "макс" подзапроса, с заменой case, если null и другие являются полями даты, а некоторые - левыми (может быть NULL)... другими словами, смешанными типами полей. Я считаю, что причина этого связана с тем, что сопоставление ОС и сопоставление базы данных несколько отличаются, но, преобразовывая все в обрезанные строки до окончательного выбора, он сортирует его, все в SQL.

Ответ 3

У меня были проблемы с сопоставлениями, так как у меня было большинство таблиц с Modern_Spanish_CI_AS, но некоторые, которые я унаследовал или скопировал из другой базы данных, имели сопоставление SQL_Latin1_General_CP1_CI_AS.

В моем случае, самый простой способ решения проблемы был следующим:

  1. Я создал копию таблиц "Латинской Америки", используя таблицу сценариев как...
  2. Новые таблицы, очевидно, получили сопоставление "Современная испанская" в моей базе данных
  3. Я скопировал данные своей таблицы "Латиноамериканский" в новую, удалил старую и переименовал новую.

Я надеюсь, что это помогает другим пользователям.

Ответ 4

если база данных поддерживается вами, то просто создайте новую базу данных и импортируйте данные из старой. проблема сопоставления решена !!!!!