我正在运行查询,但却发出了错误。
查询
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位数字。
这是什么错误?怎么解决?
答案 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来查看它并建议解决方案。