我已将我们的一个数据库 (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
??
关于排序规则的事情是,虽然数据库有自己的排序规则,但每个表、每个列都可以有自己的排序规则。如果未指定,它将采用其父对象的默认值,但可以不同。
当您更改数据库的排序规则时,它将成为所有新表和列的新默认排序规则,但不会更改数据库内现有对象的排序规则。您必须手动更改每个表和列的排序规则。
幸运的是,互联网上有可用的脚本可以完成这项工作。我不会推荐任何,因为我还没有尝试过,但这里有一些链接:
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
您的表中两种不同的排序规则不匹配。
运行以下查询:
选择 col.name, col.collation_name 从 系统列 在哪里 object_id = OBJECT_ID('你的表名称') 解决问题 运行以下查询
ALTER TABLE YourTableName ALTER COLUMN OffendingColumn VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL