2008-11-21 17 views

Respuesta

35
Declare @MyInt integer Set @MyInt = 123 
Declare @StrLen TinyInt Set @StrLen = 8 

Select Replace(Str(@MyInt, @StrLen), ' ' , '0') 
+0

O sobre la marcha si se dan longitudes fijas: 'SELECT REPLACE (STR (DATEPART (MONTH, [Date]), 2), '', '0')' – dakab

35

Otra forma es:

DECLARE @iVal int = 1 
select REPLACE(STR(@iVal, 8, 0), ' ', '0') 
+0

¿Cómo funciona eso? – Coops

+1

Lo hice y funciona. Pregunté más sobre cómo funcionan juntas estas funciones, quizás la pregunta es por qué no hay un método integrado para ello. – Coops

+0

Para dejar espacios iniciales, quite la opción Reemplazar, p. seleccione STR (@iVal, 8, 0) –

0

O si realmente quiere ir núcleo duro ... ;-)

declare @int int 
set @int = 1 

declare @string varchar(max) 
set @string = cast(@int as varchar(max)) 

declare @length int 
set @length = len(@string) 

declare @MAX int 
set @MAX = 8 

if @length < @MAX 
begin 
    declare @zeros varchar(8) 
    set @zeros = '' 

    declare @counter int 
    set @counter = 0 

    while (@counter < (@MAX - @length)) 
    begin 
     set @zeros = @zeros + '0' 
     set @counter = @counter + 1 
    end 
    set @string = @zeros + @string 
end 
print @string 
1

Si estoy tratando de almohadilla a una longitud total específica, utilizo las funciones REPLICATE y DATALENGTH, así:

DECLARE @INT INT 
DECLARE @UNPADDED VARCHAR(3) 
DECLARE @PADDED VARCHAR(3) 

SET @INT = 2 
SET @UNPADDED = CONVERT(VARCHAR(3),@INT) 
SET @PADDED = REPLICATE('0', 3 - DATALENGTH(@UNPADDED)) + @UNPADDED 
SELECT @INT, @UNPADDED, @PADDED 

Utilicé variables aquí para simplificar, pero verá, puede especificar la longitud final de la cadena total y no preocuparse por el tamaño de la INT con la que comienza, siempre que sea < = la longitud final de la cadena.

1

siempre uso:

SET @padded = RIGHT('z0000000000000' 
    + convert(varchar(30), @myInt), 8) 

El z deja de SQL desde coverting implícitamente la cadena en un int para la adición/concatenación.

1

Si el int puede ser negativo tiene un problema, de modo de evitar esto a veces hago esto:

DECLARE @iVal int 
set @iVal = -1 
    select 
     case 
      when @ival >= 0 then right(replicate('0',8) + cast(@ival as nvarchar(8)),8) 
      else '-' + right(replicate('0',8) + cast(@ival*-1 as nvarchar(8)),8) 
     end 
+0

Gracias por atrapando esta caja de borde. –

7

Este trabajo para mí:

SELECT RIGHT('000' + CAST(Table.Field AS VARCHAR(3)),3) FROM Table 

...

Creé esta función de usuario

Código de T-SQL:

CREATE FUNCTION CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(24) AS BEGIN 

IF @intlen > 24 
    SET @intlen = 24 

RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(24),@intVal)))) 
    + CONVERT(nvarchar(24),@intVal) END 

Ejemplo:

SELECT dbo.CIntToChar (867, 6) AS COD_ID

SALIDA

28

partir de SQL Server 2012 ahora puede hacer esto:

format(@int, '0000#') 
+3

Te amo gordy :) – Charles380

+0

awesome !! ¡Gracias! –

+0

solución sucinta para sucky int :) – wwmbes

0

Y luego está esto o ne, utilizando REPLICATE:

SELECT REPLICATE('0', 7) + '1' 

Por supuesto, puede reemplazar los literales 7 y '1' con funciones apropiadas según sea necesario; lo anterior le da su ejemplo. Por ejemplo:

SELECT REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt) 

rellenará un número entero de menos de 8 lugares con ceros de hasta 8 caracteres.

Ahora, un número negativo en el segundo argumento de REPLICATE devolverá NULL.Por lo tanto, si eso es una posibilidad (por ejemplo, @myInt podría ser más de 100 millones en el ejemplo anterior), entonces usted puede utilizar unen para devolver el número sin ceros a la izquierda si hay más de 8 caracteres:

SELECT COALESCE(REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt), CONVERT(nvarchar, @myInt)) 
1

muy manera directa a pensar en el acolchado con 'de 0 es decir, si usted fija su @ _int de tener 4 decimales, se inyecta 4' de 0:

select RIGHT('0000'+ Convert(varchar, @_int), 4) as txtnum 

; si su espacio fijo es 3, inyecte 3'0's

select RIGHT('000'+ Convert(varchar, @_int), 3) as txtnum 

; a continuación me inyecto '00' 99 para generar etiquetas para cada edif

declare @_int int 
set @_int = 1 
while @_int < 100 Begin 
    select BldgName + '.Floor_' + RIGHT('00'+ Convert(varchar, @_int), 2) 
    + '.balcony' from dbo.tbl_FloorInfo group by BldgName 
    set @_int = @_int +1 
End 

resultado es:

'BldgA.Floor_01.balcony' 
    'BldgB.Floor_01.balcony' 
    'BldgC.Floor_01.balcony' 
    .. 
    .. 
    'BldgA.Floor_10.balcony' 
    'BldgB.Floor_10.balcony' 
    'BldgC.Floor_10.balcony' 
    .. 
    .. 
    .. 
    'BldgA.Floor_99.balcony' 
    'BldgB.Floor_99.balcony' 
    'BldgC.Floor_99.balcony' 
Cuestiones relacionadas