最近在执行一些跨库关联查询语句的时候提示了 “Cannot resolve the collatior conflict between "Chinese_PRC_Ci As" and "soL Latini_General_CPi_Ci As" in the equal tol peratn” 的错误,查询整理一下相关资料如下:
排序规则
排序规则指定表示数据集中每个字符的位模式。 排序规则还确定数据的排序和比较规则,单个库可能存在多个不同的排序规则,通过语句
SELECT CONVERT(nvarchar(128), SERVERPROPERTY('collation'));
可以查询当前实例的排序方式 .
排序规则冲突原因
当连接有两个不同排序规则的表或者列的时候,会导致无法关联,无法比较,从而报错。比如我们有两个表,一个表使用Latin1_General_100_CI_AI_SC_UTF8排序规则,另一个表使用Chinese_PRC_CI_AS排序规则。当我们尝试比较或连接这两个表时,就会遇到排序规则冲突问题。
解决冲突的办法
1.使用COLLATE语句
使用 COLLATE 关键字可以显示的指定排序方式,在连接或者比较的时候使用可以覆盖原有的排序规则,例如:
Select * from A Inner Join B On A.Id = B.Id
//修改后
Select * from A Inner Join B On A.Id COLLATE Chinese_PRC_CI_AS = B.Id
2.修改数据库或者表的默认排序规则
如果频繁出现规则冲突,可以将某个表的规则调整,
ALTER DATABASE [db01] COLLATE Chinese_PRC_CI_AS
另外,当处理有数据的表的时候该语句不会生效,可以通过:
1.创建一个正确排序规则的table
2.数据从旧表复制过来
3.删除原表
4.新表重命名