2013-12-12 18 views
24

私は2つの異なるサーバーからの2つのテーブルの内部結合を使用しているビューで作業しています。私たちはリンクサーバーを使用しています。 SQL Serverクエリで照合競合を取り除くにはどうすればよいですか?

は「順序SQL_Latin1_General_CP1_CI_AS」と等しい操作で「Arabic_CI_AS」との照合の競合を解決できません:クエリを実行しているとき、私はこのメッセージを取得しています。

照合についてよく分かりません。インターネットで検索すると、COLLATEを使用するソリューションが見つかりますが、COLLATEのコンセプトは私には分かりません。いずれかのデータベースで何か変更されますか?私はデータベースのための何も変更せずに解決策を探しています。

これらのコンセプトの良い学習教材は歓迎します。

+0

作業中のSQLコードを表示できますか? –

答えて

37

クエリで使用されている照合順序を特定の照合順序に強制することで、この問題を解決できます。 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つの照合の競合に対処することなく、テキスト列をequals(=)のような演算子と比較することはできません。

+0

ありがとうございます。コードをCOLLATEで更新しています。問題がある場合はお知らせします。つまり、データベースレベルでは何も変更されず、このCOLLATEはSQLスクリプト内でのみ実行されます。 – elmo

+0

ありがとうございました。私の問題は解決しました。 – elmo

+0

興味深いことに、今までは、データベースレベルの照合順序を変更してemと一致させる必要があると思っていました。これは私にトラブルの多くを保存していただきありがとうございます。 – Niklas

3

私は

初期クエリは列の一部がMaxまたは合計機能とサブクエリから来ると、出力の個々の列を与えて見つける働いていた...別のクエリにクエリをラップすることにより、同様の問題を解決し、 「別個の」または事例の置換などを伴う他のもの。

私はそれを書いたように、クエリが実行されますが、エラーは、SQLを保存し、それを再読み込みした後に発生するであろう...と出力の単一のフィールドを作成しようとした後

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

を照合エラーが発生しました。何かのようにそれを固定巻き上げ

...

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

一部のフィールドがnullと他の人が日付フィールドである場合にケースの置換で、サブクエリの「最大」であり、いくつかが残っている参加する(かもしれませんつまりNULLであること)...つまり、混合フィールド型。これは、OSの照合とデータベースの照合がわずかに異なるために発生した問題の原因だと考えられますが、最終的な選択の前にトリムされた文字列にすべて変換することで、すべてSQL内でソートされます。

関連する問題