Я пытаюсь скопировать схему с одного сервера на другой, и у меня появляется следующая ошибка, и я не знаю, с чего начать, чтобы отладить эту проблему ...
Ошибка 2 SQL01268: поставщик данных .Net SqlClient: сообщение 468, уровень 16, состояние 9, процедура Import_Keys, строка 41 Не удается разрешить конфликт сопоставления между «SQL_Latin1_General_CP437_CI_AI» и «SQL_Latin1_General_CP1_CI_AS» при выполнении операции равенства. СхемаCompare1 552 0
Любая помощь будет оценена по достоинству! Использование SQL Server 2008 R2
Спасибо,
Райан
Похоже, у ваших серверов и / или баз данных разные сопоставления. Представляет ли эта конкретная строка кода предложение where, в котором используется таблица #temp? В 2008 R2 и ранее таблицы #temp создаются с использованием параметров сортировки сервера, а не параметров сортировки вызывающей базы данных. Такая же проблема возникнет, если вы попытаетесь приравнять любые два столбца, где сопоставление отличается из-за сервера или базы данных, в которой был создан столбец.
Взгляните на строку 41, она должна указывать на столбцы, вызывающие проблему. Вы можете отследить их и увидеть, что их collation_name
значение будет другим в sys.columns
(обратите внимание, что похоже, что они могут быть в разных базах данных).
Как вы могли догадаться, изменить параметры сортировки сервера или базы данных нетривиально, однако вы можете обойти это, изменив предложения where следующим образом:
WHERE left_column COLLATE SQL_Latin1_General_CP437_CI_AI
= right_column COLLATE SQL_Latin1_General_CP437_CI_AI
Это, конечно, не весело, и вы можете ограничить спецификаторы сопоставления столбцами, которые не используя локальную сортировку. Я много лет имел дело с системой, в которой один экземпляр был настроен как CP437, а два других были настроены как CP1. Какой кошмар! Вы знаете, есть ли причина, по которой использовался CP437?
Добавляем немного информации к информации, которую дал @Aaron:
Сопоставление хранится как значение по умолчанию на сервере базы данных, одно хранится как значение по умолчанию в каждой базе данных, а одно хранится с каждый столбец таблицы символьного типа. Если вы пытаетесь изменить параметры сортировки для всей базы данных, недостаточно изменить параметры по умолчанию для базы данных или около того, вы должны изменить параметры сортировки для каждого отдельного столбца символьного типа в каждой отдельной таблице. Однако это может быть даже лучше, чем долгое время жить с разными сопоставлениями.
Кстати, CP437 - это старый 8-битный набор символов DOS по умолчанию. CP1 определяет кодовую страницу 1252 (очевидно, не так ли :), 8-битный набор символов Windows по умолчанию. CI означает нечувствительность к регистру, AI - без учета акцента, AS - с учетом диакритического знака. ( http://msdn.microsoft.com/en-us/library/ms180175.aspx ) Итак, вы должны принять некоторые решения: как вы хотите, чтобы ваши данные сравнивались? Каков фактический набор символов?