在SQL Server上使用不同的排序规则在两个数据库之间进行连接并获取错误

时间:2010-02-18 17:33:27

标签: sql-server tsql collation

我知道,我知道我在问题中写的内容我不应该感到惊讶。但我的情况是继续在继承的POS系统上工作,我的前任显然不知道JOIN,所以当我查看其中一个加载60秒的内部页面时,我发现它很快,将这8个查询重写为一个查询JOINs情况。问题是,除了不了解JOIN之外,他似乎也对多个数据库感到惊讶并且惊讶,他们使用不同的排序规则。事实是我们使用所有“正常”的拉丁字符,说英语的人会考虑整个字母表,这整个事情将在几个月内不再使用,所以我只需要一个绑带。

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

确切错误是:

  

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

2 个答案:

答案 0 :(得分:114)

你可以在查询中使用collat​​e子句(我现在找不到我的例子,所以我的语法可能不对 - 我希望它指出你正确的方向)

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

答案 1 :(得分:54)

通用方法是将排序规则强制转换为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