データベース(DB1)の1つをSQL Server 2008から2012に移動しました。ストアドプロシージャを実行すると、次のエラーが表示されます。
等しい操作で「SQL_Latin1_General_CP1_CI_AS」と「Latin1_General_CI_AS」の間の照合の競合を解決できません
を使用してデータベースの照合順序を変更しました
ALTER DATABASE [optimiser] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [optimiser] COLLATE SQL_Latin1_General_CP1_CI_AS
ALTER DATABASE [optimiser] SET MULTI_USER
しかし、ストアドプロシージャを実行するたびにエラーが発生します。 SPは別のデータベース(GEのihistorian)への結合を使用しており、照合の不一致があるためだと思います。 ISとにかくこれを解決します。
古いサーバーでは、DB1はLatin1_General_CI_AS
として設定され、これは正常に機能します。 DBの新しい場所のデフォルトはSQL_Latin1_General_CP1_CI_AS
です。新しいサーバーの照合順序n DB1をLatin1_General_CI_AS
に戻す価値はありますか?
照合に関することは、データベースには独自の照合がありますが、すべてのテーブル、すべての列に独自の照合があることです。指定されない場合、デフォルトの親オブジェクトが使用されますが、異なる場合があります。
データベースの照合順序を変更すると、すべての新しいテーブルと列の新しいデフォルトになりますが、データベース内の既存のオブジェクトの照合順序は変更されません。すべてのテーブルと列の照合順序を手動で変更する必要があります。
幸いなことに、インターネット上で仕事をすることができるスクリプトが利用可能です。私はそれらを試していないのでお勧めしませんが、ここにいくつかのリンクがあります:
http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database
オンザフライでデータベース内のすべてのフィールドの照合を更新
http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx
2つのオブジェクトで異なる照合を行う必要がある場合、または照合を変更できない場合は、JOIN
コマンドを使用し、結合する照合を選択して、それらの間でCOLLATE
を実行できます。
SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE Latin1_General_CI_AS
または、デフォルトのデータベース照合を使用します。
SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT