繁体   English   中英

如何修复 SQL Server 查询中的排序规则冲突?

[英]How to fix a collation conflict in a SQL Server query?

我正在处理一个视图,其中我在来自两个不同服务器的两个表上使用内部联接。 我们正在使用链接服务器。 运行查询时,我收到此消息:

无法解决 equal to 操作中“SQL_Latin1_General_CP1_CI_AS”和“Arabic_CI_AS”之间的排序规则冲突。

我对整理不太了解。 通过互联网搜索我找到了使用COLLATE解决方案,但我不清楚COLLATE的概念。 它会改变任何数据库吗? 我正在寻找一种无需更改数据库任何内容的解决方案。

欢迎任何有关这些概念的好的学习材料。

您可以通过强制查询中使用的归类为特定归类来解决该问题,例如SQL_Latin1_General_CP1_CI_ASDATABASE_DEFAULT 例如:

SELECT MyColumn
FROM FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS

在上面的查询中,a.MyID 和 b.YourID 将是基于文本数据类型的列。 使用COLLATE将强制查询忽略数据库上的默认排序规则,而是使用提供的排序SQL_Latin1_General_CP1_CI_AS ,在本例中为SQL_Latin1_General_CP1_CI_AS

基本上这里发生的事情是每个数据库都有自己的排序规则,它“为您的数据提供排序规则、大小写和重音敏感属性”(来自http://technet.microsoft.com/en-us/library/ms143726.aspx )并适用于具有文本数据类型的列,例如VARCHARCHARNVARCHAR等。当两个数据库具有不同的排序规则时,如果不解决两个不同排序规则之间的冲突,则无法使用诸如等于 (=) 之类的运算符来比较文本列。

我通过将查询包装在另一个查询中解决了类似的问题...

初始查询正在工作 find 给出单独的输出列,其中一些列来自具有 Max 或 Sum 函数的子查询,而其他列来自具有“不同”或大小写替换等的子查询。

在尝试使用...创建单个输出字段后,我遇到了整理错误。

select
rtrim(field1)+','+rtrim(field2)+','+...

查询将在我编写它时执行,但在保存 sql 并重新加载它后会发生错误。

最后用类似的东西修复它...

select z.field1+','+z.field2+','+... as OUTPUT_REC
from (select rtrim(field1), rtrim(field2), ... ) z

有些字段是子查询的“最大值”,如果为空则替换为大小写,其他字段是日期字段,有些是左连接(可能为 NULL)……换句话说,混合字段类型。 我相信这是由操作系统排序规则和数据库排序规则略有不同引起的问题的原因,但是通过在最终选择之前将所有字符串转换为修剪后的字符串,它会在 SQL 中进行排序。

添加到接受的答案,您可以使用DATABASE_DEFAULT作为编码。

这允许数据库为您做出选择,您的代码变得更加可移植。

SELECT MyColumn
FROM 
    FirstTable a
        INNER JOIN SecondTable b
            ON a.MyID COLLATE DATABASE_DEFAULT = b.YourID COLLATE DATABASE_DEFAULT

我在整理时遇到了问题,因为我的大部分表都带有Modern_Spanish_CI_AS ,但是我从另一个数据库继承或复制的一些表具有SQL_Latin1_General_CP1_CI_AS整理。

就我而言,解决问题的最简单方法如下:

  1. 我已经创建了一个表的副本,这些表是“拉丁美洲的,使用脚本表作为......
  2. 新表显然获得了我的数据库的“现代西班牙语”整理
  3. 我已将“拉丁美洲”表的数据复制到新表中,删除了旧表并重命名了新表。

我希望这可以帮助其他用户。

如果数据库由您维护,则只需创建一个新数据库并从旧数据库导入数据。 整理问题解决了!!!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM