在 SQL Server 上跨两个具有不同排序规则的数据库执行联接并出现错误

Doing a join across two databases with different collations on SQL Server and getting an error

提问人:Andrew G. Johnson 提问时间:2/19/2010 最后编辑:casperOneAndrew G. Johnson 更新时间:2/13/2014 访问量:131988

问:

我知道,我知道我在问题中写的内容我不应该感到惊讶。但是我的情况正在慢慢开发继承的 POS 系统,而我的前任显然不知道 JOIN,所以当我查看其中一个加载 60 秒的内部页面时,我发现这是一个相当快的,将这 8 个查询重写为一个带有 JOIN 情况的查询。问题是,除了不了解 JOIN 之外,他似乎还迷恋多个数据库和惊喜,惊讶他们使用不同的排序规则。事实是,我们使用所有“正常”的拉丁字符,说英语的人会认为整个字母表,而这整个东西将在几个月内停止使用,所以我只需要一个创可贴。

长话短说,我需要某种方法来转换为单个排序规则,以便我可以比较两个数据库中的两个字段。

确切的错误是:

无法解决排序规则冲突 之间 “SQL_Latin1_General_CP850_CI_AI”和 “SQL_Latin1_General_CP1_CI_AS” 等于操作。

SQL-SERVER T-SQL 排序规则

评论


答:

134赞 Ray 2/19/2010 #1

您可以在查询中使用 collate 子句(我现在找不到我的示例,所以我的语法可能是错误的 - 我希望它为您指明正确的方向)

select sone_field collate SQL_Latin1_General_CP850_CI_AI
  from table_1
    inner join table_2
      on (table_1.field collate SQL_Latin1_General_CP850_CI_AI = table_2.field)
  where whatever
67赞 gbn 2/19/2010 #2

一种通用方法是强制排序规则DATABASE_DEFAULT。这将删除可能更改的排序规则名称的硬编码。

它对于临时表和表变量也很有用,并且您可能不知道服务器排序规则(例如,您是将您的系统放置在客户服务器上的供应商)

select
    sone_field collate DATABASE_DEFAULT
from
    table_1
    inner join
    table_2 on table_1.field collate DATABASE_DEFAULT = table_2.field
where whatever

评论

0赞 NitinSingh 4/23/2020
最好使用默认回退,而不是检查不同的排序规则。不知道为什么同一个数据库在不同的地方有不同的排序规则:(
0赞 Josef Ginerman 11/10/2021
应按@Ray将查询记入答案,因为它是带有格式更改的复制粘贴。