2013-02-26 191 views
2

我試圖只顯示幾個字段的組合。 (我被客戶要求這麼做)。我想下面的命令,但我得到上述錯誤:無法解析選擇語句中第5列的排序規則衝突

的SQL代碼片段:

SELECT  dbo.VPayment_2.Serial, dbo.VPayment_1.Description, dbo.VPayment_2.Money, dbo.VPayment_1.PaymentType,, 
         'Payment ' + dbo.VPayment_1.PaymentType + ' - ' + ' Serial ' + CAST(dbo.VPayment_2.Serial AS nvarchar(15)) 
         + '(' + dbo.VPayment_1.Description + ')' AS Compact Info 
FROM   dbo.VPayment_2 INNER JOIN 
         dbo.VPayment_1 ON dbo.VPayment_2.ID = dbo.VPayment_1.ID 

這樣最終的結果會是什麼樣子:

--------------------------------------------------------------------------- 
Serial Description Money PaymentType   Compact Info 
123456 some info  500$  Check  Payment :Check - Serial 123456 - some info 
0  some info2  100$  In Cash  Payment :In Cash - Serial 0 - some info 

要做到這一點我創建了兩個意見出問題的表格,然後使用內部ID加入這兩個視圖,以便得到觀察結果。問題是當我添加緊湊信息字段,這是其他領域的組合它產生的錯誤:

Can not resolve collation conflict on column 5 in select statement

而這種情況發生時,我沒有比較任何東西。

回答

10

聽起來像dbo.VPayment_1.PaymentTypedbo.VPayment_2.Serial是不同的排序規則(這不僅發生在比較時,而且當你聯合,連接等)。

有幾個修正:

  1. 改變一個視圖或兩者使用相同的排序規則的列。您可以通過更改基礎列或通過在視圖的SELECT列表中指定COLLATE子句來完成此操作,例如,

    SELECT PaymentType COLLATE Latin1_General_CI_AI 
    ... FROM ... 
    
  2. 查詢,例如內顯式整理

    ... 'Payment ' + dbo.VPayment_1.PaymentType COLLATE Latin1_General_CI_AI 
        + ' - ' + ' Serial ' + CAST(dbo.VPayment_2.Serial COLLATE Latin1_General_CI_AI 
        AS nvarchar(15)) 
    
  3. 最好的解決方案是糾正所有字符串列以使用相同的排序規則。我遇到過很多情況,人們在不同的表格,數據庫或服務器上使用不同的排序規則,但尚未得到有效的解釋 - 大多數時候他們不知道排序規則爲何不同。

+0

謝謝,但是當我嘗試將其設置爲Persian_CI_AS它說它是無效的! ?我應該怎麼顯示波斯人的角色呢?我相信SQL Server 2008支持波斯語整理,我已經設置了我的數據庫! – Breeze 2013-02-26 17:38:36

+1

沒有'Persian_CI_AS'這樣的東西。也許你的意思是'Persian_100_CI_AS'? – 2013-02-26 17:40:04

+0

太棒了:)是的,它:)上帝保佑你先生,非常感謝你:) – Breeze 2013-02-26 17:41:20

相關問題