SQL Server 2008 R2 に 2 つのデータベース (X と Y) があります。何らかの理由で、データベースとサーバーのエンコーディング (SQL_Latin1_general_CP1_CI_AS
およびLatin1_General_CI_AS
) が異なるため、一時テーブルまたはテーブル変数を使用すると、常に照合の問題に直面します。
データベースYからいくつかの情報を選択してテーブル変数に入れる@info
この方法で両方に参加しようとすると、本当にうまくいきます:
select d.data_id, i.info_id, i.info_value
from X.aaa.data d
join @info i on i.serial COLLATE DATABASE_DEFAULT =
SUBSTRING(d.serial, 17, 10) COLLATE DATABASE_DEFAULT
しかし、シリアルの長さは製品ごとに異なる可能性があるため、変数を使用して実行したいと考えています。
declare @serial_length int = 10;
-- some switch case to set @serial_length to some other value
select d.data_id, i.info_id, i.info_value
from X.aaa.data d
join @info i on i.serial COLLATE DATABASE_DEFAULT =
SUBSTRING(d.serial, 17, @serial_length) COLLATE DATABASE_DEFAULT
これを試してみると、クエリは永遠に実行され、何もしません。
この問題の回避策はありますか? または、少なくとも誰かがなぜこれが起こっているのか知っていますか?
更新: MitchWheatのおかげで、照合はもはや問題ではありませんデータベース照合の変更と TempDB オブジェクトの処理
しかし、SELECT
それでもうまくいきません。別の手順でも使用してSUBSTRING(serial, 17, @serial_length)
いますが、テーブル変数がなくても機能します。