我已将其中一个数据库(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
??
答案 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