2011-01-12 111 views
0

我想添加0到数投在SQL Server 2005

DECLARE @AccPD Char(6) 
DECLARE @PostMT Char(2) 

SELECT @accpd ='201102' 

select @PostMT = case when substring(@accpd,5,2) = '01' 
    then substring(@accpd,5,2) + 11 
    else CAST('00' AS Char(2)) + substring(@accpd,5,2)-1 
end 

SELECT @PostMT 

,应返回01而不是1

回答

4
DECLARE @Number INT 

SET @Number = 9 

Select '0' + CAST(@Number as VarChar(30)) 

将输出 '09'

我就值给予更具体的帮助,但对于我的生活,我无法真正理解你想在这里完成什么。

此外,如果你想只垫一个int和回到这里的字符串是为一个函数:

/* 
    Usage: 
    select dbo.fn_PadInt(3, '0', 5) 

    Returns '00003' 
*/ 
CREATE FUNCTION fn_PadInt 
(
    @Input Int, 
    @PadCharacter Char(1), 
    @Length Int 
) 
RETURNS VarChar(20) 
AS 
BEGIN 

    DECLARE @InputLen INT 
    DECLARE @Output VarChar(20) 

    SET @InputLen = LEN(@Input) 
    SET @Output = CAST(@Input as VarChar(20)) 

    WHILE @InputLen < @Length 
     BEGIN 
      SET @Output = @PadCharacter + @Output 
      SET @InputLen = @InputLen + 1 
     END 

    Return @Output 

END 
1
DECLARE @AccPD Char(6) 
DECLARE @PostMT Char(2) 

SELECT @accpd ='201102' 

select @PostMT = case when substring(@accpd,5,2) = '01' 
    then right(substring(@accpd,5,2) + 11, 2) 
    else right(100 + substring(@accpd,5,2)-1, 2) 
end 

SELECT @PostMT 

的问题是,当你在第一次使用

then substring(@accpd,5,2) + 11 

CASE语句的分支,+11产生一个INT结果,这也会强制第二个分支变成INT结果(1)。当[INT]结果被分配给变量@PostMT Char(2)时,此时INT(1)被转换为“1”(注意由于固定宽度char2造成的空间)

1

填充左边通常是用REPLICATE

DECLARE @AccPD Char(6) 
DECLARE @PostMT Char(2) 

SELECT @accpd ='201102' 

select @PostMT = case when substring(@accpd,5,2) = '01' 
    then substring(@accpd,5,2) + 11 
    else substring(@accpd,5,2)-1 
end 


SET @PostMT = REPLICATE('0', 2 - LEN(@PostMT)) + @PostMT 
SELECT @PostMT