2017-11-24 14 views
0

私はSSMS 2017の問題に直面しています。バックグラウンドでSQLスクリプトを実行する社内アプリケーションをセットアップしようとしています。セットアップ時に、私はエラーの下に取得しています:照合の競合を解決できません - SQLスクリプトの問題

Exception: Failed to execute script:xxx.sql.. Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the UNION operation..

私はこの問題を解決するには、次のことを試してみましたが、それはまだ解消されない:

  1. は、デフォルトの照合順序として「順序SQL_Latin1_General_CP1_CI_AS」で空のデータベースを作成し、セットアップを再度実行しました。
  2. "Latin1_General_CI_AS"という既定の照合順序で空のデータベースを作成し、セットアップを再度実行しました。
  3. 英語(Unites States)の代わりにサーバー上のローカル言語を英語(イギリス)に変更してから、セットアップを再度実行しようとしました。

同じSQLインスタンスで(期待どおりに動作している)他のデータベースでは、デフォルトの照合順序が "Latin1_General_CI_AS"に設定されています。また、バックグラウンドで実行されているので、SQLスクリプトを変更することはできません。私はSSMSデータベースを変更することしかできません。

この問題の原因は何ですか?また、この問題を解決するために他に何ができますか?

答えて

0

データベース照合順序を変更しても、すでに異なる照合順序が割り当てられている列は更新されないため、次のような問題が発生します。一部の表の列の一部が誤って別の照合順序あなたがテストした空のデータベースの作成中に?あなたがそれらのブランクのいずれかのデータベースで次のクエリを実行する場合は、結果を得るのですか?あなたが一致しない列を持っている場合は

DECLARE @COLLATION AS VARCHAR(128); 

SELECT @COLLATION = collation_name 
FROM sys.databases 
WHERE database_id = DB_ID() 
; 

SELECT C.* 
FROM sys.Columns C 
INNER JOIN sys.Tables T 
    ON C.object_id = T.object_id 
    AND T.is_ms_shipped = 0 
WHERE C.collation_name <> @COLLATION 
; 

することは、あなたは、それによってあなたの2番目のスクリプトがエラーなしで実行することができ、それらの特定のフィールドの照合を更新するスクリプトを実行する最初の試みることができます。スクリプトが照合順序を一致に依存している場合は、将来的には同じ問題に遭遇するかもしれないので、とにかく修正/このチェックを組み込むことは良い考えかもしれません。

は古い、問題のデータベースに基づいてスクリプトから作成した空のデータベースでしたか?もしそうなら、私は何かがそのデータベースにあなたの照合順序でmeddledと仮定しなければならない、との問題は、単にあなたの新しい空のデータベースに垂れています。

0

other databases (which are working as expected) on the same SQL instance has default collation set to "Latin1_General_CI_AS"

これは、私はあなたのServer CollationLatin1_General_CI_ASだと思いますとにかく、あなたはそれをこのように確認することができます。

select SERVERPROPERTY('Collation') 

だからあなたserver collationLatin1_General_CI_ASですが、アプリケーションが古い(レガシー)の照合を使用しているSQL_Latin1_General_CP1_CI_AS

私はそれだけで、この照合を持つ列を持つそのテーブルを持っている想像し、今ではあなたのsystem databasesに対してそのクエリを実行し、すべてのシステムテーブルはLatin1_General_CI_ASを持っている、またはそれだけでも、あなたのtempdbLatin1_General_CI_ASを継承一時テーブルを作成します。

コードにアクセスできない場合(アプリケーションが使用していたファイルを書いているようです)、SQL Serverの別のインスタンスをインストールし、インストール中にSQL_Latin1_General_CP1_CI_ASserver collationとして選択してください。

アプリケーションが実行するコードにアクセスできる場合は、COLLATE節を使用して質問を更新してください。

関連する問題