排序规则冲突 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 的设计者会有不同的默认排序规则。
我正在使用 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 的设计者会有不同的默认排序规则。