52

我已将我们的一个数据库 (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??

4

1 回答 1

113

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

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

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

http://www.codeproject.com/Articles/302405/The-Easy-way-of-sharing-Collat​​ion-of-all-Database

动态更新数据库中所有字段的排序规则

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
于 2013-07-12T14:17:28.730 回答