Как мне преобразовать int в строку с добавлением нуля в T-SQL? - PullRequest
40 голосов
/ 21 ноября 2008

Допустим, у меня есть int со значением 1. Как я могу преобразовать это int в строку с дополнением нулями, например 00000001?

Ответы [ 12 ]

40 голосов
/ 21 ноября 2008
Declare @MyInt integer Set @MyInt = 123
Declare @StrLen TinyInt Set @StrLen = 8

Select Replace(Str(@MyInt, @StrLen), ' ' , '0')
35 голосов
/ 21 ноября 2008

Другой способ:

DECLARE @iVal int = 1
select REPLACE(STR(@iVal, 8, 0), ' ', '0')
31 голосов
/ 21 августа 2013

начиная с SQL Server 2012, теперь вы можете сделать это:

format(@int, '0000#')
9 голосов
/ 07 марта 2010

Эта работа для меня:

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

...

Я создал эту пользовательскую функцию

Код 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

Пример:

ВЫБРАТЬ dbo.CIntToChar (867, 6) КАК COD_ID

OUTPUT

000867

1 голос
/ 05 июня 2018

Используйте FORMAT(<your number>,'00000000') используйте столько нулей, сколько необходимо, чтобы в конечном результате были цифры.

Вот официальная документация функции FORMAT

1 голос
/ 09 мая 2015

Очень простой способ думать о заполнении '0', если вы исправили свои @ _int, чтобы иметь 4 десятичных знака, вы вводите 4 '0:

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

; если ваше фиксированное пространство равно 3, вы вводите 3'0

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

; ниже я ввожу '00', чтобы сгенерировать 99 ярлыков для каждого здания

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

Результат:

    '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'
1 голос
/ 13 января 2009

Если int может стать отрицательным, у вас есть проблема, поэтому, чтобы обойти это, я иногда делаю это:

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
1 голос
/ 13 января 2009

Я всегда использую:

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

Z не позволяет SQL неявно покрывать строку в int для сложения / объединения.

1 голос
/ 21 ноября 2008

Если я пытаюсь заполнить определенную общую длину, я использую функции REPLICATE и DATALENGTH, например:

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

Я использовал здесь переменные для простоты, но вы видите, что вы можете указать конечную длину общей строки и не беспокоиться о размере INT, с которого вы начинаете, пока он <= конечная длина строки. </p>

0 голосов
/ 16 апреля 2018

Я думаю, что ответ Чарльза Бретаны самый простой и быстрый. Аналогичное решение без использования STR:

SELECT REPLACE(REVERSE(
        CONVERT(CHAR(5 /*<= Target length*/)
                , REVERSE(CONVERT(VARCHAR(100), @MyInt)))
     ), ' ', '0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...