web-dev-qa-db-ja.com

照合の競合を解決できません

データベース(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に戻す価値はありますか?

41
Silentbob

照合に関することは、データベースには独自の照合がありますが、すべてのテーブル、すべての列に独自の照合があることです。指定されない場合、デフォルトの親オブジェクトが使用されますが、異なる場合があります。

データベースの照合順序を変更すると、すべての新しいテーブルと列の新しいデフォルトになりますが、データベース内の既存のオブジェクトの照合順序は変更されません。すべてのテーブルと列の照合順序を手動で変更する必要があります。

幸いなことに、インターネット上で仕事をすることができるスクリプトが利用可能です。私はそれらを試していないのでお勧めしませんが、ここにいくつかのリンクがあります:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collat​​ion-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
85
Nenad Zivkovic