提问人:Andrew G. Johnson 提问时间:2/19/2010 最后编辑:casperOneAndrew G. Johnson 更新时间:2/13/2014 访问量:131988
在 SQL Server 上跨两个具有不同排序规则的数据库执行联接并出现错误
Doing a join across two databases with different collations on SQL Server and getting an error
问:
我知道,我知道我在问题中写的内容我不应该感到惊讶。但是我的情况正在慢慢开发继承的 POS 系统,而我的前任显然不知道 JOIN,所以当我查看其中一个加载 60 秒的内部页面时,我发现这是一个相当快的,将这 8 个查询重写为一个带有 JOIN 情况的查询。问题是,除了不了解 JOIN 之外,他似乎还迷恋多个数据库和惊喜,惊讶他们使用不同的排序规则。事实是,我们使用所有“正常”的拉丁字符,说英语的人会认为整个字母表,而这整个东西将在几个月内停止使用,所以我只需要一个创可贴。
长话短说,我需要某种方法来转换为单个排序规则,以便我可以比较两个数据库中的两个字段。
确切的错误是:
无法解决排序规则冲突 之间 “SQL_Latin1_General_CP850_CI_AI”和 “SQL_Latin1_General_CP1_CI_AS” 等于操作。
答:
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将查询记入答案,因为它是带有格式更改的复制粘贴。
评论