Выполнение объединения двух баз данных с разными параметрами сортировки на SQL Server и получение ошибки - PullRequest
56 голосов
/ 18 февраля 2010

Я знаю, я знаю, что я написал в вопросе, я не должен удивляться. Но моя ситуация медленно работает на унаследованной системе POS, и мой предшественник, очевидно, не знал о JOIN, поэтому, когда я заглянул на одну из внутренних страниц, которая загружается в течение 60 секунд, я вижу, что это довольно быстро, переписать эти 8 запросов как один запрос с ситуацией JOINS. Проблема в том, что помимо того, что он не знал о JOIN, у него, кажется, также был фетиш к нескольким базам данных и удивление, удивление, что они используют различные сопоставления. Дело в том, что мы используем все «нормальные» латинские символы, которые англоговорящие люди будут рассматривать весь алфавит, и через несколько месяцев все это выйдет из употребления, поэтому все, что мне нужно, - это бандаид.

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

Точная ошибка:

Не удалось разрешить конфликт сопоставления между «SQL_Latin1_General_CP850_CI_AI» и «SQL_Latin1_General_CP1_CI_AS» в равно операции.

Ответы [ 2 ]

114 голосов
/ 18 февраля 2010

Вы можете использовать предложение collate в запросе (сейчас я не могу найти свой пример, поэтому мой синтаксис, вероятно, неверен - надеюсь, он укажет вам правильное направление)

select sone_field collate SQL_Latin1_General_CP850_CI_AI
  from table_1
    inner join table_2
      on (table_1.field collate SQL_Latin1_General_CP850_CI_AI = table_2.field)
  where whatever
54 голосов
/ 18 февраля 2010

Универсальный способ состоит в том, чтобы привести параметры сортировки к DATABASE_DEFAULT. Это удаляет жесткое кодирование имени сопоставления, которое может измениться.

Это также полезно для временных таблиц и переменных таблиц, а также для случаев, когда вы можете не знать параметры сортировки сервера (например, вы поставляете свою систему на сервер клиента)

select
    sone_field collate DATABASE_DEFAULT
from
    table_1
    inner join
    table_2 on table_1.field collate DATABASE_DEFAULT = table_2.field
where whatever
...