2013-02-26 192 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

相关问题