【问题标题】:collation conflict SQL Server varchar stored procedure parameters排序规则冲突 SQL Server varchar 存储过程参数
【发布时间】:2023-04-04 03:46:01
【问题描述】:

我正在使用REXTESTER 编写一段 SQL Server 代码。

它说正在使用的是 SQL Server 2014 Express Edition...

这是导致该消息的最少代码。

CREATE PROCEDURE #CONVERT_TIME_TO_24_HR
(
  @TIME_STRING varchar(4)
)
AS
BEGIN
  DECLARE @AMPM as varchar(2);
  SET @AMPM = RIGHT(@TIME_STRING,2);
  IF @AMPM = 'am'
    SELECT 2
END
GO

这是错误:

Error(s), warning(s):
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

如果刚刚声明了@TIME_STRING 而不是存储过程的参数,我没有问题。由于我无法控制 SQL Server 实例,我该如何解决这个问题?

这是一个forked version,当它不是参数时 - 没问题

DECLARE @TIME_STRING varchar(4);
DECLARE @AMPM as varchar(2);
SET @AMPM = RIGHT(@TIME_STRING,2);
  IF @AMPM = 'am'
    SELECT 2

【问题讨论】:

    标签: sql sql-server collation


    【解决方案1】:

    发生这种情况是因为服务器/数据库/列的排序规则具有不同的值(可能是服务器和数据库)。您可以通过显式添加排序规则来修复它:

    CREATE PROCEDURE #CONVERT_TIME_TO_24_HR (
      @TIME_STRING varchar(4)
    ) AS
    BEGIN
      DECLARE @AMPM as varchar(2);
      SET @AMPM = RIGHT(@TIME_STRING,2);
      IF @AMPM = 'am' COLLATE SQL_Latin1_General_CP1_CI_AS ;
      SELECT 2;
    END;
    

    我承认这不是一个普通的专栏。在您自己的系统上,默认排序规则可能都匹配。我不知道为什么 Rextester 的设计者会有不同的默认排序规则。

    【讨论】:

    • 非常感谢。这是一种享受。虽然不是很直观。在 IF 而不是声明上这样做似乎很奇怪。特别是如果您也有多个 IF!
    • @JGFMK 。 . .它不在if 上。它是恒定的。我认为使常量与存储的数据具有相同的排序规则更明智,反之亦然。但是当我想到它时,常量会从变量声明中得到不同的排序规则是很奇怪的。我现在考虑这个问题还为时过早。
    • 不幸的是,虽然它通过了语法检查,但 'am' 或 'pm' 的条件永远不会通过....
    • Doh... SQL Server RIGHT 简直是天方夜谭。讨厌该命令,因为它不一致stackoverflow.com/a/44987409/495157
    • SET @AMPM = RIGHT(@TIME_STRING,2);给出错误的结果 SET @ AMPM = SUBSTRING(@TIME_STRING,LEN(@TIME_STRING)-1,2) 有效 - 错误的堆栈溢出不喜欢 @ 之间没有空格
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多