Не удаётся разрешить конфликт сопоставления
Описание проблемы:
Я перенёс одну из наших баз данных (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;
Однако ошибка продолжает возникать каждый раз при выполнении хранимых процедур. Я подозреваю, что это связано с тем, что хранимая процедура использует соединение с другой базой данных (ihistorian от GE), и там имеется несоответствие в сортировке.
Есть ли способ разрешить эту проблему? На старом сервере DB1 была установлена сортировка Latin1_General_CI_AS
, и всё работало исправно. Новое местоположение базы данных имеет сортировку по умолчанию SQL_Latin1_General_CP1_CI_AS
. Есть ли смысл менять сортировку базы данных DB1 на новом сервере обратно на Latin1_General_CI_AS
?
1 ответ(ов)
У вас есть несоответствие двух различных сортировок в вашей таблице. Чтобы узнать, какие сортировки используются в ваших столбцах, выполните следующий запрос:
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
Не забудьте заменить YourTableName
и OffendingColumn
на название вашей таблицы и соответствующего столбца. Это приведёт к изменению сортировки столбца на указанную.
Как удалить с использованием INNER JOIN в SQL Server?
Сброс начального значения идентификатора после удаления записей в SQL Server
Переименование столбца в SQL Server 2008
Обновление и замена части строки
with(nolock) или (nolock) - есть ли разница?