2012-05-04 3 views
0

Итак, я пытаюсь сделать что-то ДЕЙСТВИТЕЛЬНО просто; изменить таблицу и добавить ограничение внешнего ключа. Проблема заключается в том, что я выбрал ошибку, что-то похожее на сопоставление столбцов, не соответствующее:Ошибка сортировки MSSQL

Столбец blah не такой же сортировки, как ссылка столбца blah во внешнем ключе blah.

Я не понимаю этого, и я везде искал. Когда я смотрю на странице свойств SQL, он показывает ту же сортировку (Latin1_General_CI_AS). Я везде искал, и я не знаю, как это изменить. Любой, кто может помочь, будет оценен по достоинству. Благодаря!

+0

Пожалуйста, пост DDL для обеих таблиц –

ответ

5

При попытке сравнить две строки в SQL Server, то параметры сортировки должны соответствовать, в противном случае вы получите эту ошибку. Collation сообщает SQL Server, как сравнивать строки (т. Е. CHAR, NCHAR, VARCHAR, NVARCHAR). В сопоставлении Latin1_General_CI_AS используется набор символов Latin1_ General, нечувствительный к регистру, чувствительный к акценту.

Некоторые вещи вы должны знать, прежде чем дать вам решение: Есть три уровня сортировки в SQL Server:

  1. сервера по умолчанию параметры сортировки: Это устанавливается во время установки SQL Server, и определяет по умолчанию для новых баз данных, созданных на сервере. Это также стандартная сортировка, используемая для системных баз данных, включая TempDB. Другими словами, если вы создаете временную таблицу без указания используемой сортировки, она будет использовать по умолчанию сервер. Вы можете найти это, щелкнув правой кнопкой мыши на сервере и выбрав свойства.
  2. Стандартная настройка базы данных по умолчанию. Это сопоставление, которое будет использоваться, когда таблицы создаются в базе данных, без явного указания сортировки при создании таблицы. По умолчанию это то же самое, что и сортировка сервера, но может быть указана при создании базы данных. Если вы создадите резервную копию базы данных и восстановите ее на другом сервере с другой сортировкой, она сохранит свою собственную сортировку и не наследует сервер. Вы можете это увидеть, щелкнув правой кнопкой мыши по базе данных и выбрав свойства.
  3. Поле сортировки. Это сортировка для определенного поля и существует для всех строковых полей в базе данных. Если вы измените сортировку базы данных, она не изменит сортировку всех строковых полей в базе данных; только те поля, которые впоследствии создаются в базе данных. Вы можете увидеть эту сортировку в дизайнере таблицы, используя sp_help TableName или щелкнув правой кнопкой мыши по полю и выбрав свойства.

Чтобы исправить вашу проблему, вам необходимо изменить сортировку одного из двух полей, которые вы пытаетесь сравнить, чтобы сделать их одинаковыми.Изменение как для соответствия сортировки базы данных, вероятно, будет ваша лучшая практика:

ALTER TABLE MyMaster ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS 
ALTER TABLE MyDetail ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS 

Тогда вы будете в состоянии определить внешний ключ:

ALTER TABLE MyDetail ADD CONSTRAINT FK_Master_Detail FOREIGN KEY (MyMasterKey) REFERENCES MyMaster(MyMasterKey) 
1

Кажется, что две таблицы или два поля (внешний ключ - первичный ключ) имеют разные сортировки. Можете ли вы дать нам дополнительную информацию?

  1. Можете ли вы подтвердить сортировку в базе данных?
  2. Можете ли вы подтвердить сопоставление в поле внешнего ключа, а также первичный ключ в таблице с ссылками?
  3. Вы используете временные таблицы где угодно? Таблицы Temp принимают сопоставление экземпляра sql. Если база данных была создана с другой сортировкой, эта проблема может возникнуть.

Посмотреть этот пост о том, как проверить параметры сортировки: SQL Authority Blogpost

+0

Ну Я использую SQL Server 2008 R2, и я просто щелкаю по нему в проводнике объектов и просматриваю расширенные свойства, он показывает оба сопоставления как Latin1_General_CI_AS ... – Jack

Смежные вопросы