如何摆脱SQL Server查询中的排序规则冲突?

时间:2013-12-12 13:05:49

标签: sql-server database collation

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

  

无法在等于操作的情况下解决“SQL_Latin1_General_CP1_CI_AS”和“Arabic_CI_AS”之间的排序规则冲突。

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

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

5 个答案:

答案 0 :(得分:55)

您可以通过强制查询中使用的排序规则作为特定排序规则来解决此问题,例如: 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

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

答案 1 :(得分:3)

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

初始查询正在查找给出单独的输出列,其中一些列来自具有Max或Sum函数的子查询,另一些列具有“distinct”或大小写替换等。

尝试使用...创建单个输出字段后遇到了排序规则错误

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中。

答案 2 :(得分:0)

我在排序规则方面遇到了麻烦,因为我的大多数表都使用Modern_Spanish_CI_AS,但是我从另一个数据库继承或复制的一些表却具有SQL_Latin1_General_CP1_CI_AS排序规则。

对于我来说,解决问题的最简单方法如下:

  1. 我使用脚本表作为...创建了“拉丁美洲”表的副本。
  2. 新表显然已经获得了我数据库的'Modern Spanish'排序规则
  3. 我已将“拉丁美洲”表的数据复制到新表中,删除了旧表并重命名了新表。

我希望这对其他用户有帮助。

答案 3 :(得分:0)

除了接受的答案外,您还可以使用DATABASE_DEFAULT作为编码。

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

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

答案 4 :(得分:-1)

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