【问题标题】:Collation conflict in stored procedure while assigning a variable分配变量时存储过程中的排序规则冲突
【发布时间】:2010-11-30 10:15:21
【问题描述】:

我们正在尝试创建一个存储过程,但是我们遇到了以下错误消息:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

这个错误出现在第33行,内容如下:

SET @MINTIME = (SELECT CONVERT(varchar,DATEADD(MONTH,-1,GETDATE()),112));

有人知道如何解决这个问题吗?

【问题讨论】:

  • 向我们展示@mintime 的声明。
  • 声明 @MINTIME 为 VARCHAR(50);

标签: sql sql-server sql-server-2005 tsql collation


【解决方案1】:

正常情况下是这样的

SET @MINTIME =
(SELECT CONVERT(varchar,DATEADD(MONTH,-1,GETDATE()),112)) COLLATE DATABASE_DEFAULT;

或者

仅适用于列定义,例如在表变量中:DECLARE @MINTIME varchar(??) COLLATE DATABASE_DEFAULT

发生这种情况是因为您在某处存在不匹配,例如 @mintime 排序规则(作为 DECLARE 时间)与数据库排序规则(用于转换为 varchar)不匹配

编辑:你确定是这条线吗? 该错误通常发生在字符串比较中。在简单的赋值中,右手表达式的排序规则将被强制转换为左手排序规则。

随机想法:第 33 行,这是第 1 行通常是“CREATE PROC”的地方,并排除右键单击时添加的 SET ANSI 等内容,在 SSMS 中编辑

【讨论】:

  • 不幸的是,这会导致完全相同的错误消息。您还有其他建议吗?
  • 我怀疑情况正好相反:@mintime 可能没有使用数据库默认排序规则
  • @iar:试试 SQL_Latin1_General_CP1_CI_AS 或 Latin1_General_CI_AS
  • 与此同时,我的同事发现数据库服务器使用的排序规则与我们要在其中创建此存储过程的数据库不同。此答案中的两个建议仍然会导致错误消息。第一个在同一错误消息中,第二个在“关键字'COLLATE'附近的语法不正确。”。
  • 虽然第 33 行被确定为问题的原因,但通过在存储过程中插入查询的 WHERE 子句中添加一些整理语句来解决该问题。但是,此 WHERE 子句确实涉及 @MINTIME 变量。 WHERE 部分现在如下所示:WHERE CallLocalTimeString>=@MINTIME AND CallLocalTimeString
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2012-11-20
  • 2011-04-17
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2012-01-21
相关资源
最近更新 更多