如果@MONTH的长度为1,则向@MONTH追加'0'

Cla*_*ist 0 t-sql sql-server

如果这是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如果字符数@MONTH1,否则输出@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时失败.

Ale*_* K. 6

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)