"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,
...
)
这将使用当前数据库的排序规则创建列,而不是服务器的排序规则。
在我处理的一些程序中,我写了这段代码:
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,
...
)
这将使用当前数据库的排序规则创建列,而不是服务器的排序规则。