SQL_Latin1_General错误

时间:2016-06-16 10:07:26

标签: sql sql-server sql-server-2012

我已从本地数据库(MSSQL SERVER 2012)创建了.bak文件,并在实时服务器(MSSQL Server 2012)上恢复了该文件。它正在工作,但有些stored_procedures没有执行并且正在生成错误:

  

无法解决之间的排序规则冲突   " SQL_Latin1_General_CP1_CI_AS"和   " Latin1_General_CI_AI"   在等于操作

我不知道这个错误是什么以及如何解决它?

我有成千上万的stored_procedures。如何在所有存储过程中解决此问题?

1 个答案:

答案 0 :(得分:2)

问题可能是“本地”SQL Server与“实时”SQL Server之间的排序规则设置存在差异,因此数据库和数据库对象使用了错误的排序规则。

安装开发服务器时,需要密切关注服务器参数(ANSI设置,校对等),以确保它们与您的生产服务器完全匹配。这同样适用于数据库参数。关于排序规则设置如何运作的See this somewhat old but still relevant article

您可以通过SSMS或运行以下查询来查找当前的排序规则设置(请参阅MSDN):

-- Server Collation Setting
SELECT CONVERT (varchar, SERVERPROPERTY('collation'));

-- Database Collation Settings
SELECT name, collation_name FROM sys.databases;

-- Table column Collation Settings
SELECT t.name, c.name AS ColName, *
FROM sys.tables AS t
    INNER JOIN sys.columns AS c ON t.object_id = c.object_id
WHERE not collation_name is NULL
ORDER BY t.name, column_id

如何解决此问题有两种选择:

更改数据库和所有对象的排序规则设置

要解决“实时”环境中的这种整理差异,您需要:
 1. Change collation of your database以匹配生产服务器的整理设置
 2.更改表/视图等中每列的排序规则(请参阅此post

最简单的解决方案是使用正确的排序规则设置重新创建数据库中的每个对象(更改数据库排序规则后)。

修改您的代码

第二个选项是人们在评论中建议的,名称明确指定代码中“无处不在”的整理设置。该选项应作为最后手段或在绝对必要时使用(在必要时无法想到原因)。

也可以change collation of the server,但这不是一个真正的选择。