Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
排序规则冲突SQL Server varchar存储过程参数_Sql_Sql Server_Collation - Fatal编程技术网

排序规则冲突SQL Server varchar存储过程参数

排序规则冲突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

我正在使用来编写一段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_字符串只是声明的,而不是存储过程的参数,那么我就没有问题了。由于我无法控制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有效-错误的堆栈溢出不象@之间没有空格