2012-08-23 42 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

我試過,但給出了相同的錯誤 –