排序规则冲突 SQL 服务器 varchar 存储过程参数

collation conflict SQL Server varchar stored procedure parameters

我正在使用 REXTESTER 编写一段 SQL 服务器代码。

它说正在使用 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 服务器实例,我该如何解决这个问题?

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

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

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

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 的设计者会有不同的默认排序规则。