无法解决整理冲突

时间:2013-07-12 13:57:29

标签: sql sql-server sql-server-2008 sql-server-2012 collation

我已将其中一个数据库(DB1)从SQL Server 2008移至2012年,当我运行存储过程时出现以下错误

  

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

我使用

更改了数据库的排序规则
ALTER DATABASE [optimiser] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [optimiser] COLLATE SQL_Latin1_General_CP1_CI_AS
ALTER DATABASE [optimiser] SET MULTI_USER

但是每当存储过程运行时我仍然会收到错误。我相信因为SP正在使用连接到另一个数据库(GE的ihistorian)并且它具有排序规则不匹配。无论如何要解决这个问题。

在旧服务器上,DB1设置为Latin1_General_CI_AS,这样可以正常工作。数据库的新位置默认为SQL_Latin1_General_CP1_CI_AS。是否值得将新服务器上的排序规则n DB1更改回Latin1_General_CI_AS ??

1 个答案:

答案 0 :(得分:85)

关于排序规则的事情是,尽管数据库拥有自己的排序规则,但每个表和每个列都可以拥有自己的排序规则。如果未指定,则采用默认的父对象,但可以不同。

更改数据库的排序规则时,它将是所有新表和列的新默认值,但不会更改数据库中现有对象的排序规则。您必须手动更改每个表和列的排序规则。

幸运的是,互联网上有可以完成这项工作的脚本。我不会推荐任何,因为我没有尝试过,但这里有几个链接:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

Update Collation of all fields in database on the fly

http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx

如果您需要对两个对象进行不同的排序规则或无法更改排序规则 - 您仍然可以使用JOIN命令在它们之间COLLATE,并选择要加入的排序规则。

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE Latin1_General_CI_AS 

或使用默认数据库归类:

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT
相关问题