如果这是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时,转换失败。
答案 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盒子
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;