如果@MONTH长度为1

时间:2018-04-18 13:09:13

标签: sql-server tsql

如果这是SQL中一个非常基本的问题,我很抱歉,但谷歌搜索并没有帮助我解释为什么这段代码无效。

DECLARE @MONTH INT;
SET @MONTH = 3;

DECLARE @MONTH_STR VARCHAR(2);
SET @MONTH_STR = CASE 
                    WHEN NCHAR(@MONTH) = 1 THEN '0' + @MONTH
                    ELSE @MONTH
                 END;

这会导致错误:

  

Msg 245,Level 16,State 1,Line 8
  将nvarchar值''转换为数据类型int时,转换失败。

@MONTH可以接受值1,2,3,...,12,@MONTH_STR正在做的就是这样:在0的左侧添加@MONTH如果@MONTH的字符数为1,则输出@MONTH为长度为2的字符串。

错误消息对我没有意义。我也尝试在CAST上使用@MONTH作为NVARCHAR(2)变量,但我得到了同样的错误:

DECLARE @MONTH INT;
SET @MONTH = 3;

DECLARE @MONTH_STR VARCHAR(2);
SET @MONTH_STR = CASE
                    WHEN NCHAR(CAST(@MONTH AS VARCHAR(2))) = 1
                       THEN '0' + CAST(@MONTH AS VARCHAR(2))
                       ELSE CAST(@MONTH AS VARCHAR(2))
                 END;

错误:

  

Msg 245,Level 16,State 1,Line 8
  将nvarchar值''转换为数据类型int时,转换失败。

2 个答案:

答案 0 :(得分:6)

NCHAR(@MONTH)不是转换/强制转换 - 它是一个函数调用,它返回带有字符代码3的unicode字符,因此后续的比较不起作用。

如果要使用CASE,则两个分支都必须返回字符类型:

SET @MONTH_STR = case when @MONTH < 10 THEN '0' + CAST(@MONTH AS VARCHAR(2))
                 else CAST(@MONTH AS VARCHAR(2))
                 end;

没有案例的简单方法:

SET @MONTH_STR = RIGHT('0' + CAST(@MONTH AS VARCHAR(2)), 2)

答案 1 :(得分:0)

在你的第二个T-SQL块中,你试图得到@MONTH的长度,所以需要一个LEN。以下内容适用于我的2008R2盒子

&#13;
&#13;
DECLARE @MONTH INT;
SET @MONTH = 3;

DECLARE @MONTH_STR VARCHAR(2);
SET @MONTH_STR = case when LEN(CAST(@MONTH AS VARCHAR(2))) = 1 THEN '0'+CAST(@MONTH AS VARCHAR(2))
                 else CAST(@MONTH AS VARCHAR(2))
                 end;

SELECT @MONTH_STR
&#13;
&#13;
&#13;