在SQL Server上使用不同的sorting规则在两个数据库之间进行连接,并发生错误
我知道,我知道我在这个问题上写了什么,我不应该感到惊讶。 但是我的情况正在缓慢地工作在一个inheritance的POS系统上,而我的前任显然不知道JOIN,所以当我查看加载了60秒的内部页面之一时,我发现这很快,将这8个查询重写为一个查询与JOINs情况。 问题在于,除了不了解JOIN之外,他似乎也对多个数据库和惊喜产生了迷恋,惊喜地使用了不同的sorting规则。 事实是,我们使用所有“正常的”拉丁字符,说英语的人会认为整个字母表,这整个事情将在几个月内不使用,所以我只需要一个绷带。
长话短说,我需要某种方法来铸造一个单一的sorting规则,所以我可以比较两个数据库中的两个字段。
确切的错误是:
在等于操作中无法解决“SQL_Latin1_General_CP850_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的sorting规则冲突。
你可以在查询中使用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
通用的方法是将sorting规则强制转换为DATABASE_DEFAULT。 这将删除可能更改的sorting规则名称的硬编码。
这对于临时表和表variables也是有用的,在那里你可能不知道服务器的sorting规则(例如你是一个把你的系统放在客户服务器上的供应商)
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