5

このスクリプトの実行中に次のエラーが発生します。私は次のものを使用してみました:COLLATELatin1_General_CI_AS。並べ替えてもらえますか?ありがとう

メッセージ457、レベル16、状態1、8行
目照合の競合が原因で値の照合が解決されていないため、varchar値からvarcharへの暗黙的な変換を実行できません。

DECLARE @AccountID INT 
SET @AccountID = 12

SELECT TOP 1    ac.AccountID,
            co.Email,
            ao.AccountOptionID
FROM CRM.acc.Account ac
INNER JOIN CRM.[profile].[Profile] pr
    ON pr.ProfileID = ac.ProfileFK
INNER JOIN CRM.[profile].Contact co
    ON pr.ProfileID = co.ProfileFK
LEFT JOIN CRM.acc.[AccountOption] ao
    ON ao.AccountFK = ac.AccountID
LEFT JOIN (
            SELECT OptionID
            FROM CRM.acc.[Option]
            WHERE [Name] = 'SMS messages') op
    ON op.OptionID = ao.OptionFK
WHERE ac.AccountID = @AccountID

UNION ALL

SELECT      u.UnsubscribeID,
        u.EmailAddress,
        u.SentEmailFK
FROM  Email.dbo.Unsubscribe u
  INNER JOIN  (
                    SELECT      CASE
                                      WHEN AccountTypeFK = 2 THEN OnlineBillingEmail
                                      ELSE EmailBillingEmail
                                END [EmailAddress]
                    FROM  CRM.acc.Account
                    WHERE AccountID = @AccountID                    
                    ) ace
        ON ace.EmailAddress COLLATE DATABASE_DEFAULT  = u.EmailAddress COLLATE DATABASE_DEFAULT
WHERE ISNULL(ace.EmailAddress, '') != ''
4

2 に答える 2

4

データベースにさまざまな照合タイプがあるようです。次に、この場合のように、テーブルまたは他のデータベースのテーブルに結合するときに問題が発生する可能性があります。これを回避するには、列の照合を指定するか、2つの列を結合するときにCOLLATE句を使用して照合を強制します。MSDNで照合の詳細を確認してください

また、問題のある列を使用しているCOLLATE句を指定する必要があります。この答えを確認してください、それは非常によく似た質問に答えます

グローバルに単一の照合に固執することをお勧めします。そうしないと、問題が発生します。

さまざまな照合スタイルの詳細な説明を参照してください

編集:列の照合を確認するには、このスニペットを使用します

SELECT name, collation_name
  FROM sys.columns
  WHERE OBJECT_ID IN (SELECT OBJECT_ID
                        FROM sys.objects
                       WHERE type = 'U'
                         AND name = 'your_table_name'
                      )
    AND name = 'your_column_name'

編集:データベース上の異なる照合を持つすべての列を取得するためのスニペットを追加しました

SELECT [TABLE_NAME] = OBJECT_NAME([id]),
       [COLUMN_NAME] = [name],
       [COLLATION_NAME] = collation
  FROM syscolumns
 WHERE collation <> 'your_database_collation_type'
   AND collation IS NOT NULL
   AND OBJECTPROPERTY([id], N'IsUserTable')=1
于 2012-08-23T08:53:16.600 に答える
1

これを試して

ace.EmailAddress COLLATE Latin1_General_CI_AS = u.EmailAddress COLLATE Latin1_General_CI_AS
于 2012-08-23T08:40:49.317 に答える