0

SQL Server 2014 Enterpriseを使用しています。私はテーブル、列名、データベース間のレコード数をチェックする必要があるクライアントからいくつかの異なるデータベースを受け取りました。 Except機能を使用する場合、私は、照合の問題に遭遇しました:SQL Serverアクセントの感度の照合で、交差操作以外の操作が発生する

SELECT c.name "ColumnName" 
FROM [DB1].sys.tables t 
INNER JOIN [DB1].sys.all_columns c ON t.object_id = c.object_id 
INNER JOIN [DB1].sys.types ty ON c.system_type_id = ty.system_type_id 
WHERE t.name = 'test' 

EXCEPT 

SELECT c.name 
FROM [DB2].sys.tables t 
INNER JOIN [DB2].sys.all_columns c ON t.object_id = c.object_id 
INNER JOIN [DB2].sys.types ty ON c.system_type_id = ty.system_type_id 
WHERE t.name = 'test2' 

これはエラーを生成します:FYI

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AI" and "SQL_Latin1_General_CP1_CI_AS" in the EXCEPT operation.

DB1は "SQL_Latin1_General_CP1_CI_AI"、DB2

は "順序SQL_Latin1_General_CP1_CI_AS" でありますこれは、私のようなクエリでCOLLATE関数を介して解決することができますか?もしそうなら、どうですか?私はこれを行うための権限を持っていないとして、私は私たちのITが参加する必要があります

USE master; 
GO 

ALTER DATABASE [DB2] 
COLLATE SQL_Latin1_General_CP1_CI_AI ; 
GO 

また、およそ私はオンラインを見つけたことを、次のものを。

+1

ご理解いただきありがとうございます。marc_s – Craig

答えて

1

異なる照合順序を持つ値があるため、比較のために同じ照合順序にする必要があります。それを行う1つの方法は、この(EXCEPTの両方の部分で同じ照合順序を使用して、使用する照合を決める)のようになる:

SELECT c.name COLLATE SQL_Latin1_General_CP1_CI_AS AS ColumnName 
FROM 
    [DB1].sys.tables t 
    INNER JOIN [DB1].sys.all_columns c ON t.object_id = c.object_id 
    INNER JOIN [DB1].sys.types ty ON c.system_type_id = ty.system_type_id 
WHERE t.name = 'test' 

EXCEPT 

SELECT c.name COLLATE SQL_Latin1_General_CP1_CI_AS 
FROM 
    [DB2].sys.tables t 
    INNER JOIN [DB2].sys.all_columns c ON t.object_id = c.object_id 
    INNER JOIN [DB2].sys.types ty ON c.system_type_id = ty.system_type_id 
WHERE t.name = 'test2' 

役に立たないデータベース全体(ALTER DATABASE [DB2] COLLATE SQL_Latin1_General_CP1_CI_AI;)の照合を変更し、理由ALTER DATABASE既存の列の照合は変更されませんが、新しい列のデフォルトの照合にのみ影響します。

+0

ありがとうございました。 – Craig

関連する問題