1. ホーム
  2. sql-server

[解決済み] 等値演算で "SQL_Latin1_General_CP1_CI_AS" と "Latin1_General_CI_AS" の照合の競合を解決できない

2022-02-05 16:57:15

質問事項

次のようなコードがあります。

SELECT tA.FieldName As [Field Name],
       COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
       COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
       U.UserName AS [User Name],
       CONVERT(varchar, tA.ChangeDate) AS [Change Date] 
  FROM D tA
       JOIN 
       [DRTS].[dbo].[User] U 
         ON tA.UserID = U.UserID
       LEFT JOIN 
       A tO_A 
         on tA.FieldName = 'AID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
       LEFT JOIN 
       A tN_A 
         on tA.FieldName = 'AID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
       LEFT JOIN 
       B tO_B 
         on tA.FieldName = 'BID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
       LEFT JOIN 
       B tN_B 
         on tA.FieldName = 'BID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
       LEFT JOIN 
       C tO_C 
         on tA.FieldName = 'CID' 
        AND tA.oldValue = tO_C.Name
       LEFT JOIN 
       C tN_C 
         on tA.FieldName = 'CID' 
        AND tA.newValue = tN_C.Name
 WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate

コードを実行すると、テーブルCの2つの結合を追加した後にタイトルにあるようなエラーが発生します。これは、私がSQL Server 2008を使用していて、このデータベースのコピーを2005の私のマシンにリストアしたことと関係があるのではないかと思います。

どうすればいいですか?

テーブル内に2つの異なる照合順序の不一致があります。このクエリを使用すると、テーブルの各カラムがどの照合順序を持っているかを確認することができます。

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

照合順序は、文字列を並べたり比較したりする際に必要であり、使用されます。一般に、データベース全体で単一の照合順序を使用することは良い考えです。単一のテーブルまたはデータベース内で異なる照合順序を使用しないでください。

照合順序を1つに決めたら、このコマンドを使って、まだ一致していないテーブル/カラムを変更することができます。

ALTER TABLE YourTableName
  ALTER COLUMN OffendingColumn
    VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

マルク

UPDATE: データベース内のフルテキストインデックスを見つけるには、ここでこのクエリを使用します。

SELECT
    fti.object_Id,
    OBJECT_NAME(fti.object_id) 'Fulltext index',
    fti.is_enabled,
    i.name 'Index name',
    OBJECT_NAME(i.object_id) 'Table name'
FROM 
    sys.fulltext_indexes fti
INNER JOIN 
    sys.indexes i ON fti.unique_index_id = i.index_id

そして、フルテキストインデックスを削除することができます。

DROP FULLTEXT INDEX ON (tablename)