排序规则冲突SQL Server varchar存储过程参数
我正在使用来编写一段SQL Server代码 它说正在使用的是SQL Server 2014 Express Edition 下面是导致该消息的最小代码排序规则冲突SQL Server varchar存储过程参数,sql,sql-server,collation,Sql,Sql Server,Collation,我正在使用来编写一段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' SELE
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_字符串只是声明的,而不是存储过程的参数,那么我就没有问题了。由于我无法控制SQL Server实例,因此如何解决这个问题
当它不是参数时,这里有一个例子-没有问题
DECLARE @TIME_STRING varchar(4);
DECLARE @AMPM as varchar(2);
SET @AMPM = RIGHT(@TIME_STRING,2);
IF @AMPM = 'am'
SELECT 2
这是因为服务器/数据库/列的排序规则具有不同的值(可能是服务器和数据库)。您可以通过显式添加排序规则来修复它:
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上做的,而不是在声明上做的。特别是如果你也有多个如果@JGFMK。如果,则不在
上。它是恒定的。我认为,使常量与存储的数据具有相同的排序规则更合理,反之亦然。但在我看来,一个常量会从变量声明中得到一个不同的排序规则,这很奇怪。我现在想这个问题还为时过早。不幸的是,虽然它通过了语法检查,“am”或“pm”的条件永远不会通过…Doh。。。SQL Server的正确性是非常糟糕的。讨厌这个命令,因为它的不一致性设置为@AMPM=RIGHT(@TIME\u STRING,2);给出错误的结果集@AMPM=SUBSTRING(@TIME\u STRING,LEN(@TIME\u STRING)-1,2有效-错误的堆栈溢出不象@之间没有空格