web-dev-qa-db-ja.com

SQL Serverクエリで照合の競合を取り除く方法は?

2つの異なるサーバーからの2つのテーブルで内部結合を使用しているビューで作業しています。リンクサーバーを使用しています。クエリを実行すると、次のメッセージが表示されます。

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

照合についてはあまり知りません。インターネットで検索すると、COLLATEを使用するソリューションが見つかりますが、COLLATEの概念は明確ではありません。いずれかのデータベースの変更はありますか?データベースの変更を一切行わないソリューションを探しています。

これらの概念に関する優れた学習教材は大歓迎です。

31
wsDev

クエリで使用される照合を特定の照合に強制することで問題を解決できます。 SQL_Latin1_General_CP1_CI_AS または DATABASE_DEFAULT。例えば:

SELECT MyColumn
FROM FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS

上記のクエリでは、a.MyIDとb.YourIDはテキストベースのデータ型の列になります。 COLLATEを使用すると、クエリがデータベースのデフォルトの照合を無視し、代わりに提供された照合(この場合はSQL_Latin1_General_CP1_CI_AS

基本的に、ここで行われているのは、各データベースに独自の照合順序があり、「データの並べ替え規則、大文字と小文字、およびアクセントの区別のプロパティを提供する」ことです( http://technet.Microsoft.com/en-us/library /ms143726.aspxテキストデータタイプの列に適用されます。 VARCHARCHARNVARCHARなど。2つのデータベースの照合順序が異なる場合、2つの間の競合に対処せずにテキスト列を等号(=)などの演算子で比較することはできません。異なる照合。

55
rory.ap

クエリを別のクエリでラップすることにより、同様の問題を解決しました...

最初のクエリは、MaxまたはSum関数を使用したサブクエリからの列と、「個別」またはケース置換などを使用した列の一部を含む、出力の個々の列を検索していました。

単一の出力フィールドを作成しようとした後、照合エラーが発生しました...

select
rtrim(field1)+','+rtrim(field2)+','+...

クエリは記述したとおりに実行されますが、SQLを保存して再ロードするとエラーが発生します。

次のようなものでそれを修正してしまいました...

select z.field1+','+z.field2+','+... as OUTPUT_REC
from (select rtrim(field1), rtrim(field2), ... ) z

一部のフィールドはサブクエリの「最大」で、nullの場合は大文字と小文字の置換があり、他のフィールドは日付フィールドであり、一部は左結合(nullの可能性があります)...つまり、混合フィールドタイプです。これが、OS照合とデータベース照合がわずかに異なることによって引き起こされる問題の原因であると考えていますが、最終選択の前にすべてをトリム文字列に変換することにより、すべてSQLでソートします。

3
PStuart

ほとんどのテーブルにModern_Spanish_CI_ASがあるため照合順序に問題がありましたが、別のデータベースから継承またはコピーしたいくつかのテーブルにはSQL_Latin1_General_CP1_CI_AS照合順序がありました。

私の場合、問題を解決する最も簡単な方法は次のとおりです。

  1. スクリプトテーブルを使用して、ラテンアメリカのテーブルのコピーを作成しました...
  2. 新しいテーブルは、明らかに私のデータベースの「現代スペイン語」照合を取得しました
  3. 「ラテンアメリカ」テーブルのデータを新しいテーブルにコピーし、古いテーブルを削除して、新しいテーブルの名前を変更しました。

これが他のユーザーに役立つことを願っています。

0
Ramon Baiges