无法解决等于操作中“SQL_Latin1_General_CP437_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突

无法解决等于操作中“SQL_Latin1_General_CP437_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突

我正在尝试将模式从一台服务器复制到另一台服务器,但我一直收到以下错误,而且我不知道从哪里开始调试这个问题...

错误 2 SQL01268:.Net SqlClient 数据提供程序:消息 468,级别 16,状态 9,过程 Import_Keys,第 41 行 无法解决等于操作中“SQL_Latin1_General_CP437_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。SchemaCompare1 552 0

任何帮助都将不胜感激!使用 SQL Server 2008 R2

谢谢,

瑞安

答案1

似乎您的服务器和/或数据库具有不同的排序规则。这行代码是否代表使用 #temp 表的 where 子句?在 2008 R2 及更早版本中,#temp 表是使用服务器排序规则而不是调用数据库的排序规则创建的。如果您尝试将任何两列相等,而这两列的排序规则由于创建列的服务器或数据库而不同,则会发生同样的问题。

看看第 41 行,它应该指向导致问题的列。您可以追溯它们并发现它们的collation_name值会有所不同sys.columns(请注意,听起来它们可能位于不同的数据库中)。

您可能已经猜到了,更改服务器或数据库排序规则并非易事,但是您可以通过更改 where 子句来解决这个问题,如下所示:

WHERE left_column COLLATE SQL_Latin1_General_CP437_CI_AI
   = right_column COLLATE SQL_Latin1_General_CP437_CI_AI

这当然不好玩,你可以将排序规则说明符限制在不是使用本地排序规则。多年来,我一直处理一个系统,其中一个实例设置为 CP437,而其他两个实例设置为 CP1。真是一场噩梦!您知道使用 CP437 的原因是什么吗?

答案2

在@Aaron 给出的信息中添加一些内容:

排序规则作为默认值存储在数据库服务器中,每个数据库中都存储一个默认值,并且一个存储在每个字符类型表列。如果您尝试更改整个数据库的排序规则,仅更改数据库默认值是不够的,您必须更改每个表中的每个字符类型列的排序规则。但是,这可能比长期使用不同的排序规则更好。

顺便说一句,CP437 是旧的默认 DOS 8 位字符集。CP1 指定代码页 1252(很明显,是吗:),Windows 默认的 8 位字符集。CI 表示不区分大小写,AI 表示不区分重音,AS 表示区分重音。(http://msdn.microsoft.com/en-us/library/ms180175.aspx) 因此您必须做出一些决定:您希望如何比较数据?实际的字符集是什么?

相关内容