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

Не удается разрешить конфликт сортировки между

Я переместил одну из наших баз данных (DB1) с SQL Server 2008 на 2012 год, и когда я запускаю хранимые процедуры, я получаю следующую ошибку

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

Я изменил сортировку в базе данных, используя

ALTER DATABASE [optimiser] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [optimiser] COLLATE SQL_Latin1_General_CP1_CI_AS
ALTER DATABASE [optimiser] SET MULTI_USER

Но я все равно получаю ошибку всякий раз, когда запускаются хранимые процедуры. Я считаю, потому что SP использует соединение с другой базой данных (GE ihistorian) и имеет несоответствие сортировки. В любом случае, разрешите это.

На старом сервере DB1 был установлен как Latin1_General_CI_AS, и это отлично работает. Новое местоположение для БД имеет значение по умолчанию SQL_Latin1_General_CP1_CI_AS. Стоит ли менять конфигурацию n DB1 на новом сервере на Latin1_General_CI_AS??

4b9b3361

Ответ 1

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

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

К счастью, в Интернете есть скрипты, которые могут выполнять эту работу. Я не буду рекомендовать, так как я их не пробовал, но здесь несколько ссылок:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

Обновить сортировку всех полей базы данных на лету

http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx

Если вам нужно иметь различную сортировку по двум объектам или не можете изменять сортировки, вы все равно можете JOIN между ними с помощью команды COLLATE и выберите сортировку, которую хотите для соединения.

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE Latin1_General_CI_AS 

или используя сортировку базы данных по умолчанию:

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT