0

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)いますが、テーブル変数がなくても機能します。

4

0 に答える 0