如果这是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;
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
消息245,级别16,状态1,行8
转换将nvarchar值''转换为数据类型int时失败.
@MONTH可以采取值1,2,3,...,12和所有@MONTH_STR正在做是这样的:一个附加0到左侧@MONTH如果字符数@MONTH是1,否则输出@MONTH为长度的串2.
错误消息对我没有意义.我也试过使用CASTon @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;
Run Code Online (Sandbox Code Playgroud)
错误:
消息245,级别16,状态1,行8
转换将nvarchar值''转换为数据类型int时失败.
NCHAR(@MONTH) 不是转换/强制转换 - 它是一个函数调用,它返回带有字符代码3的unicode字符,因此后续的比较不起作用.
如果要使用a,CASE则两个分支必须返回字符类型:
SET @MONTH_STR = case when @MONTH < 10 THEN '0' + CAST(@MONTH AS VARCHAR(2))
else CAST(@MONTH AS VARCHAR(2))
end;
Run Code Online (Sandbox Code Playgroud)
没有案例的简单方法:
SET @MONTH_STR = RIGHT('0' + CAST(@MONTH AS VARCHAR(2)), 2)
Run Code Online (Sandbox Code Playgroud)