我试图将模式从一台服务器复制到另一台服务器,我一直收到以下错误,我不知道从哪里开始调试这个问题……
错误2 SQL01268:.Net SqlClient数据提供程序: Msg 468,级别16,状态9,过程Import_Keys,第41行无法解决"SQL_Latin1_General_CP437_CI_AI“和"SQL_Latin1_General_CP1_CI_AS”在相等操作中的排序冲突。SchemaCompare1 552 0
任何帮助都将不胜感激!使用Server 2008 R2
谢谢,
瑞安
发布于 2011-09-07 19:33:19
似乎您的服务器和/或数据库有不同的排序规则。这一行代码是否表示使用#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吗?
发布于 2011-09-07 20:01:09
在“Aaron给”的信息中添加一些信息:
排序规则作为默认值存储在数据库服务器中,一个作为默认值存储在每个数据库中,另一个存储在每个字符类型的表列中。如果试图更改整个数据库上的排序规则,仅更改数据库默认值是不够的,必须更改每个表中每个字符类型列的排序规则。然而,这可能比长期生活在不同的校对中更好。
顺便说一下,CP437是旧的默认DOS 8位字符集.CP1指定代码页1252 (显而易见,是:),这是Windows默认的8位字符集.CI表示大小写不敏感,AI表示口音不敏感,而口音敏感。( http://msdn.microsoft.com/en-us/library/ms180175.aspx )所以您必须做出一些决定:您希望如何比较您的数据?真正的字符集是什么?
https://serverfault.com/questions/309860
复制相似问题