7

我试图将几个字段的组合显示为一个。(客户要求我这样做)。我尝试了以下命令,但出现上述错误:

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 将这两个视图连接起来,以便获得预期的结果。问题是当我添加紧凑信息字段时,它是其他字段的组合,它会生成错误:

无法解决 select 语句中第 5 列的排序规则冲突

当我不比较任何东西时,就会发生这种情况。

4

1 回答 1

17

听起来像dbo.VPayment_1.PaymentType并且dbo.VPayment_2.Serial具有不同的排序规则(这不仅发生在您比较时,还发生在您联合、连接等时)。

有几个修复:

  1. 更改一个视图或同时更改这两个视图以对这些列使用相同的排序规则。您可以通过更改基础列或在视图列表中指定COLLATE子句来执行此操作SELECT,例如

    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. 最好的解决方案是更正所有字符串列以使用相同的排序规则。我遇到过很多情况,人们在不同的表、数据库或服务器中使用不同的排序规则,但还没有得到有效的解释——大多数时候他们不知道为什么排序规则不同。

于 2013-02-26T17:17:03.437 回答