2011-01-12 4 views
0

je veux ajouter 0 à un certain nombrecast dans 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 

cela devrait retourner une valeur 01 au lieu de 1

Répondre

4
DECLARE @Number INT 

SET @Number = 9 

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

affichera '09'

Je voudrais donner une aide plus spécifique, mais pour la vie de moi, je ne peux pas vraiment comprendre ce que vous essayez d'accomplir ici.

En outre, si vous voulez simplement pad un Int et retourner une chaîne est ici une fonction pour cela:

/* 
    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 

Le problème est que lorsque vous utilisez

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

dans le premier La branche d'une instruction CASE, le +11 produit un résultat INT, ce qui force également la 2ème branche à devenir un résultat INT (de 1). Lorsque le [INT] résultat est ensuite affectée à la variable @PostMT Char (2), il est à ce point que l'INT (1) est converti en « 1 » (notez l'espace en raison de char2 largeur fixe)

1

Rembourrage à gauche est généralement fait avec 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