"Hebrew_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的归类冲突

collation conflict between "Hebrew_CI_AS" and "SQL_Latin1_General_CP1_CI_AS"

在我处理的一些程序中,我写了这段代码:

update a
set a.custName = b.custName
from #x as a inner join pl_Customer as b on a.Company_Code = b.Company_Code and a.cust = b.Cust

我收到这个错误:

Cannot resolve the collation conflict between "Hebrew_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

我试着用这个解决它:

update a
set a.custName = b.custName
from #x as a inner join pl_Customer as b on a.Company_Code = b.Company_Code and a.cust = b.Cust
collate Latin1_General_CI_AI;

但还是报错

在您的临时 table 定义 #x 中,将 COLLATE DATABASE_DEFAULT 添加到字符串列,例如

custName nvarchar(xx) COLLATE DATABASE_DEFAULT NOT NULL

默认情况下,临时 table 是使用服务器的排序规则创建的。看起来您服务器的排序规则是 SQL_Latin1_General_CP1_CI_AS 而数据库的(实际上是列的)排序规则是 Hebrew_CI_AS,反之亦然。

您可以通过在临时 table 的列定义中使用 collate database_default 来解决这个问题,例如:

create #x (
    ID int PRIMARY KEY,
    Company_Code nvarchar(20) COLLATE database_default,
    Cust nvarchar(20) COLLATE database_default,
    ...
)

这将使用当前数据库的排序规则创建列,而不是服务器的排序规则。