在 SQL Server 上使用不同的排序规则跨两个数据库进行连接并出现错误
Posted
技术标签:
【中文标题】在 SQL Server 上使用不同的排序规则跨两个数据库进行连接并出现错误【英文标题】:Doing a join across two databases with different collations on SQL Server and getting an error 【发布时间】:2011-01-18 10:40:48 【问题描述】:我知道,我知道我在问题中写的内容我不应该感到惊讶。但是我的情况正在慢慢地在继承的 POS 系统上运行,而我的前任显然不知道 JOIN,所以当我查看加载 60 秒的内部页面之一时,我发现它相当快,将这 8 个查询重写为一个查询 JOINs 情况。问题是,除了不知道 JOIN 之外,他似乎还对多个数据库有一种迷恋,令人惊讶的是,他们使用不同的排序规则。事实上,我们使用所有“正常”的拉丁字符,说英语的人会考虑整个字母表,而这整件事将在几个月内停止使用,所以我只需要一个创可贴。
长话短说,我需要某种方法来转换为单个排序规则,这样我就可以比较两个数据库中的两个字段。
确切的错误是:
无法解决排序规则冲突 之间 “SQL_Latin1_General_CP850_CI_AI”和 “SQL_Latin1_General_CP1_CI_AS”中的 等于运算。
【问题讨论】:
【参考方案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
【讨论】:
【参考方案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
【讨论】:
最好有默认的回退而不是检查不同的排序规则。不知道为什么同一个数据库在不同的地方得到不同的排序规则:( 应该将查询归功于@Ray 的答案,因为它是带有格式更改的复制粘贴。以上是关于在 SQL Server 上使用不同的排序规则跨两个数据库进行连接并出现错误的主要内容,如果未能解决你的问题,请参考以下文章