2012-08-23 41 views
4

运行此脚本时出现以下错误。我试过使用以下内容: COLLATE Latin1_General_CI_AS。请问可以分类吗?由于将varchar值隐式转换为varchar - 比较冲突

消息457,级别16,状态1,行不能因排序规则冲突

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, '') != '' 
+0

什么是你的数据库默认排序? – AnandPhadke

+0

COLLATE Latin1_General_CI_AS –

+0

对于DB'Email'= Latin1_General_CI_AS和DB'CRM'= Latin1_General_CI_AS –

回答

3

似乎你的数据库上有不同的排序规则类型。然后,在连接表或其他数据库中的表时,可能会遇到问题,如本例所示。为了解决这个问题,您可以指定列的排序规则,或者在连接两列时使用COLLATE子句强制排序规则。检查more info about collation in MSDN

此外,您还需要指定您使用有问题的列的COLLATE子句。 Check this answer,它回答了一个非常类似的问题

最好在全球范围内坚持使用单个归类。否则你会有问题。

different collation styles

编辑的详细解释:检查列排序规则使用这个片段

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 
+0

我一直在使用此语句来查找每个数据库的排序规则:SELECT DATABASEPROPERTYEX('CRM','Collat​​ion')SQLCollat​​ion;我尝试了通过使用COLLATE DATABASE_DEFAULT或COLLATE Latin1_General_CI_AS,即SELECT u.UnsubscribeID COLLATE Latin1_General_CI_AS, \t \t \t u.EmailAddress COLLATE Latin1_General_CI_AS, \t \t \t u.SentEmailFK COLLATE Latin1_General_CI_AS迫使每一列,但它仍然给我的错误。但你的回答是非常有帮助的。非常感谢,它的遗憾我不能点击你的答案作为有用 –

+0

第一个陈述是正确的'SELECT DATABASEPROPERTYEX('CRM','整理')SQLCollat​​ion'。使用它你确实证实了两个数据库的排序规则是相同的还是不同的?如果它们相等,那么你遇到的问题是列有不同的排序规则。我在编辑我的答案,添加一个代码,允许您检查列整理并查看需要更正的内容。 – Yaroslav

+0

是啊这两个数据库的排序规则与Latin1_General_CI_AS相同。我现在要检查每一列,谢谢 –

1

尝试进行8 VARCHAR值到VARCHAR的隐式转换,因为该值的排序规则是悬而未决这

ace.EmailAddress COLLATE Latin1_General_CI_AS = u.EmailAddress COLLATE Latin1_General_CI_AS 
+1

我试过,但给出了相同的错误 –