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

Sql server 如何修复SQL Server查询中的排序规则冲突?,sql-server,database,collation,Sql Server,Database,Collation,我正在处理一个视图,其中我在来自两个不同服务器的两个表上使用内部联接。我们正在使用链接服务器。运行查询时,我收到以下消息: 无法解决等于操作中“SQL\u Latin1\u General\u CP1\u CI\u AS”和“Arabic\u CI\u AS”之间的排序规则冲突 我对校勘知之甚少。通过互联网搜索,我找到了使用COLLATE的解决方案,但COLLATE的概念我并不清楚。它会改变任何数据库吗?我正在寻找一个解决方案,而不改变任何数据库 欢迎提供有关这些概念的任何好的学习材料。您可以通

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

无法解决等于操作中“SQL\u Latin1\u General\u CP1\u CI\u AS”和“Arabic\u CI\u AS”之间的排序规则冲突

我对校勘知之甚少。通过互联网搜索,我找到了使用
COLLATE
的解决方案,但
COLLATE
的概念我并不清楚。它会改变任何数据库吗?我正在寻找一个解决方案,而不改变任何数据库


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

您可以通过强制查询中使用的排序规则为特定排序规则来解决此问题,例如
SQL\u Latin1\u General\u CP1\u CI\u AS
DATABASE\u 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\u Latin1\u General\u CP1\u CI\u AS


基本上,这里的情况是每个数据库都有自己的排序规则,“为您的数据提供排序规则、大小写和重音敏感属性”(from),并应用于具有文本数据类型的列,例如
VARCHAR
CHAR
NVARCHAR
,等。当两个数据库具有不同的排序规则时,如果不解决两个不同排序规则之间的冲突,则无法使用equals(=)之类的运算符比较文本列。

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

最初的查询是working find,它提供单独的输出列,其中一些列来自使用Max或Sum函数的子查询,而另一些列则使用“distinct”或case替换等

我在尝试创建一个带有

select
rtrim(field1)+','+rtrim(field2)+','+...
查询将按我编写的方式执行,但在保存sql并重新加载后会发生错误

最后用类似于

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

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

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

我在排序方面遇到了问题,因为我的大多数表都使用了
Modern\u Spanish\u CI\u as
,但我从另一个数据库继承或复制的一些表具有
SQL\u Latin1\u General\u CP1\u CI\u as
排序

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

  • 我已经创建了一个“拉丁美洲”表格的副本,使用脚本表格作为
  • 新表显然已经获得了我数据库的“现代西班牙语”排序规则
  • 我已将“拉丁美洲”表的数据复制到新表中,删除了旧表并重命名了新表

  • 我希望这能帮助其他用户。

    添加到已接受的答案中,您可以使用
    数据库\u DEFAULT
    作为编码

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

    选择MyColumn
    从…起
    第一表a
    内联接表b
    在a.MyID COLLATE DATABASE\u DEFAULT=b.YourID COLLATE DATABASE\u DEFAULT上
    
    能否显示您正在使用的SQL代码?谢谢Roryap。我正在用COLLATE更新我的代码。我会让你知道如果有任何问题。因此,这意味着在数据库级别上不会更改任何内容,而此整理将仅在SQL脚本中进行。有趣的是,到目前为止,我认为必须更改数据库级别的整理以使em匹配,但我不知道我可以在查询中使用
    COLLATE
    匹配em!谢谢你,这帮我省去了很多麻烦。解释得很好,谢谢@rory.apFrom Review:Hi,这篇文章似乎没有为这个问题提供答案。请编辑您的答案并加以改进,或者将其作为评论发布。