在sql server 2005中强制转换

时间:2011-01-12 22:35:41

标签: sql sql-server-2005

我想将0添加到数字

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

3 个答案:

答案 0 :(得分: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 :(得分: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的空间)

答案 2 :(得分: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