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

我试图复制架构从一个服务器到另一个,我不断收到以下错误,我不知道从哪里开始debugging此问题…

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

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

谢谢,

瑞安

看起来像你的服务器和/或数据库有不同的sorting规则。 这段代码是否代表使用#temp表的where子句? 在2008 R2及更早版本中,使用服务器sorting规则而不是调用数据库的sorting规则来创build#temp表。 如果您尝试将由于创build列的服务器或数据库而导致sorting规则不同的任何两列相同,则会发生同样的问题。

看看第41行,它应该指向导致问题的列。 你可以追溯到他们,看到他们的collation_name值将在sys.columns不同(注意,这听起来像他们可能在不同的数据库中)。

正如您可能猜到的那样,更改服务器或数据库sorting规则并不是一件容易的事,但是您可以通过更改where子句来解决此问题,如下所示:

 WHERE left_column COLLATE SQL_Latin1_General_CP437_CI_AI = right_column COLLATE SQL_Latin1_General_CP437_CI_AI 

这当然不好玩,并且可以将sorting规则限制为不使用本地sorting规则的列。 我多年来一直在build立一个系统,其中一个实例设置为CP437,另外两个设置为CP1。 什么样的恶梦! 你知道CP437的使用有什么理由吗?

在@Aaron的信息中添加一些比特给了:

sorting规则作为默认值存储在数据库服务器中,其中一个作为默认值存储在每个数据库中,另一个存储在每个字符types的表列中 。 如果您尝试更改整个数据库的sorting规则,仅更改数据库默认值是不够的,则必须更改每个表中每个单一字符types列的sorting规则。 但是,这可能比长时间使用不同的sorting规则更好。

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