无法解决排序规则冲突

问题描述 投票:0回答:2

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

sql sql-server sql-server-2008 sql-server-2012 collation
2个回答
125
投票

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

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

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

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-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

0
投票

您的表中两种不同的排序规则不匹配。

运行以下查询:

选择 col.name, col.collation_name 从 系统列 在哪里 object_id = OBJECT_ID('你的表名称') 解决问题 运行以下查询

ALTER TABLE YourTableName ALTER COLUMN OffendingColumn VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

© www.soinside.com 2019 - 2024. All rights reserved.