【问题标题】:collation conflict between "Hebrew_CI_AS" and "SQL_Latin1_General_CP1_CI_AS"“Hebrew_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突
【发布时间】:2020-06-09 06:42:47
【问题描述】:

在我处理的一些程序中,我编写了以下代码:

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

我收到了这个错误:

无法解决“Hebrew_CI_AS”和“Hebrew_CI_AS”之间的排序规则冲突 “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
collate Latin1_General_CI_AI;

但它仍然是错误的。

【问题讨论】:

  • 您的表定义似乎不一致。修复它,问题就消失了。
  • 我该如何解决?
  • 你为什么用不同的排序规则创建一个临时表?
  • 两个 cust 列应具有相同的排序规则。
  • @ValiMaties 这将是一个坏主意 - 在这种情况下服务器不能使用索引并且必须执行完整扫描。此外,它是一个临时表。必须由应用程序或存储过程来创建它。通过修复该脚本来避免问题比事后尝试从中恢复要容易得多

标签: sql sql-server collation collate


【解决方案1】:

在您的临时表定义 #x 中,将 COLLATE DATABASE_DEFAULT 添加到 String 列,例如

custName nvarchar(xx) COLLATE DATABASE_DEFAULT NOT NULL

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 或者他可以将 collate database_default 置于连接条件中,例如 a.cust collate database_default = b.cust collate database_default ,它会将两列作为数据库默认排序规则进行排序,因为列的排序规则可能与数据库不同。
    • @ValiMaties 这将是一个坏主意 - 在这种情况下服务器不能使用索引并且必须执行完整扫描。此外,它是一个临时表。必须由应用程序或存储过程来创建它。通过修复该脚本来避免问题比事后尝试从中恢复要容易得多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2018-10-20
    • 2010-12-09
    相关资源
    最近更新 更多