无法解决排序规则冲突?

4

我遇到了这个错误,但不知道该如何解决:

在等于操作中无法解析“Arabic_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序冲突。

注:我已经从数据库选项更改了排序规则 -> 排序规则。

我将它从“Arabic_CI_AS”更改为“SQL_Latin1_General_CP1_CI_AS”。

但我仍然得到相同的错误!!
有什么建议可以解决这个问题吗?

1个回答

9

数据库排序规则仅适用于在未指定排序规则的情况下创建新对象。

当您将其从“Arabic_CI_AS”更改为“SQL_Latin1_General_CP1_CI_AS”时,数据库中的所有文本列仍然按照“Arabic_CI_AS”进行排序。您可以使用以下方式进行检查:

select object_name(object_id), name, collation_name
from sys.columns
where collation_name like '%Arabic%'

解决这个问题的一个补丁是在比较时添加 COLLATE DATABASE_DEFAULT,例如:
SELECT *
FROM TBL1
INNER JOIN TBL2 on X = Y COLLATE DATABASE_DEFAULT

或者

SELECT *
FROM TBL1
WHERE X = Y COLLATE DATABASE_DEFAULT

有一个脚本在此网站上,试图跨整个数据库更改排序规则,但是:

  1. 我个人没有尝试过
  2. 在尝试之前,请确保您的数据库有一个很好的备份
  3. 它似乎不能处理带有索引视图、外键/默认约束等复杂数据库

同时,新的临时表使用tempdb的排序规则,而不是当前数据库的排序规则。 - MartW
当我运行以下代码时: select object_name(object_id), name, collation_name from sys.columns where collation_name like '%Arabic%'它根本没有返回任何数据!!但是当我将其更改为: select object_name(object_id), name, collation_name from sys.columns where collation_name like '%SQL_Latin1_General_CP1_CI_AS%'它返回了所有的数据!那么问题出在哪里?我还尝试了这个:alter database dbname collate SQL_Latin1_General_CP1_CI_AS但是没有任何进展!! - HAJJAJ
@HAJJAJ,在这种情况下,请尝试使用此代码:select databasepropertyex('master','collation')。可能是服务器(和tempdb)为阿拉伯文,而数据库为拉丁文。 - RichardTheKiwi
啊嗯啊嗯...我可以知道怎么改这个吗?!! - HAJJAJ
@HAJJAJ 这很混乱。通常,我只需创建一个使用与数据库相同排序规则的新实例,并将其附加到那里。为了使特定查询起作用,请像上面所示使用 collate database_default - RichardTheKiwi
好的,我非常感激你的帮助,并原谅我浪费了你的时间。非常感谢你。这就是我寻找了三个月的答案。 - HAJJAJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接