连接错误 - 连接操作之间的排序规则冲突

时间:2017-09-29 10:19:15

标签: sql sql-server

我正在运行查询,但却发出了错误。

查询

Select [Material],CONCAT(case when len([PO Item]) = 3 then '00' when len([PO Item]) = 2 then '000' else '0000' end,[PO Item]) from Vendortable

错误

  

无法解决之间的排序规则冲突   " Latin1_General_CS_AS_KS_WS"和" SQL_Latin1_General_CP1_CI_AS"在里面   联合行动。

我想要做的是在数字的前面追加0,使其成为5位数字。

这是什么错误?怎么解决?

2 个答案:

答案 0 :(得分:2)

我认为您有不同的默认排序规则和[PO项目]排序规则,因此Select [Material], CONCAT( case when len([PO Item]) = 3 then '00' when len([PO Item]) = 2 then '000' else '0000' end collate SQL_Latin1_General_CP1_CI_AS, [PO Item] collate SQL_Latin1_General_CP1_CI_AS) from Vendortable 会有所不同

强制进行相同的整理

 select RIGHT('00000' collate SQL_Latin1_General_CP1_CI_AS + [PO Item] collate SQL_Latin1_General_CP1_CI_AS, 5) 
 from Vendortable

但是..一般来说,对于填充数字我更喜欢使用:

{{1}}

答案 1 :(得分:1)

Collation指的是管理SQL如何比较和排序字符串的规则,例如,当按字符串排序行时,被视为与a相同,或者是否单独排序?整理确定了许多其他事情。比较两列时,它们的排序规则必须匹配,以便SQL Server知道要使用哪一列。

这些规则在数据库中通常是相同的(“默认排序规则”),但通常如果您已合并数据库,升级旧数据库并添加到其中,或者有人更改了列上的默认排序规则,那么通常会有两列相同的数据库可以有不同的排序规则。正如@MtwStark指出的那样,您可以强制进行特定比较的排序,如果绝对必要,您可以在一列上change the collation来匹配另一列。

在我看来,您的数据库默认排序规则为SQL_Latin1_General_CP1_CI_AS,而[PO Item]列上的列排序规则为Latin1_General_CS_AS_KS_WS,因此出现错误。

我也同意使用right()函数更适合左边的填充:

select right('00000' collate SQL_Latin1_General_CP1_CI_AS
         + [PO Item] collate SQL_Latin1_General_CP1_CI_AS, 5) 
from Vendortable

尽管有一句警告 - 除非你知道自己在做什么,否则不要改变数据库或列整理,否则你可能会创造一个麻烦的世界(在那里)。如果这是数据库的持久性问题,请找一个好的DBA来查看它并建议解决方案。