最近做项目时,无意间碰到一个排序规则的问题
做了如下测试:
///创建表1
create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,
value int);
//创建表2
create table #t2(
name varchar(20) collate Chinese_PRC_CI_AI_WS,
value int );
///执行如下语句
select * from #t1 A inner join #t2 B on A.name=B.name
会抛出如下错误信息:
无法解决 equal to 运算中 "Chinese_PRC_CI_AI_WS" 和 "Albanian_CI_AI_WS" 之间的排序规则冲突。
///执行如下语句,可成功执行
select * from #t1 A inner join #t2 B on A.name=B.name collate Albanian_CI_AI_WS
//查询如下的结果,查看所支持的排序规则。
select * from ::fn_helpcollations()
关于此函数的说明,可参见:MSDN。
通过以上的测试,项目中的问题的原因就比较明显了。
下述是针对Kingdee EAS的说明。
EAS的单据序时簿所绑定的Query是多表连接的查询,由于多个表之间使用连接查询时,连接条件的字段的排序规则不一致导致
出现排序规则冲突。
出现上述问题的原因:
执行数据库脚本的时候,使用的是sqlserver自带的控制台,而非EAS Admin Console。
导致执行后排序规则不一致。
解决办法:
重新建表,在EAS Admin Console执行数据库脚本。
或者使用这个语句来修改每个有问题的Table的列:
ALTER TABLE xxxTable ALTER COLUMN xxxColumn [nvarchar] (32) COLLATE Chinese_PRC_CI_AS