web-dev-qa-db-ja.com

SQL Serverで異なる照合順序を持つ2つのデータベース間で結合を実行し、エラーが発生する

私が知っている、私は驚かないで質問に書いたもので知っています。しかし、私の状況は継承されたPOSシステムでゆっくりと働いており、前任者はJOINに気付いていなかったので、60秒間ロードされる内部ページの1つを調べたとき、これらの8つのクエリを1つとして書き換えますJOINを使用した状況。問題は、JOINを知らないことに加えて、彼は複数のデータベースと驚きのためのフェチを持っていたように見えることです。驚き、彼らは異なる照合を使用します。問題の事実は、英語を話す人々がアルファベット全体を考慮するすべての「通常の」ラテン文字を使用することであり、この全体は数か月で使用できなくなるため、絆創膏で十分です。

要するに、2つのデータベースの2つのフィールドを比較できるように、単一の照合にキャストする何らかの方法が必要です。

正確なエラー:

等しい操作で「SQL_Latin1_General_CP850_CI_AI」と「SQL_Latin1_General_CP1_CI_AS」の間の照合の競合を解決できません。

56

クエリでcollat​​e句を使用できます(今のところ私の例を見つけることができないので、おそらく構文が間違っています-それが正しい方向を指し示していることを望みます)

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
116
Ray

汎用的な方法は、照合を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
56
gbn