Скажем, у меня есть int со значением 1. Как я могу преобразовать этот int в нулевую заполненную строку, такую как 00000001
?
Как преобразовать int в нулевую заполненную строку в T-SQL?
Ответ 1
Declare @MyInt integer Set @MyInt = 123
Declare @StrLen TinyInt Set @StrLen = 8
Select Replace(Str(@MyInt, @StrLen), ' ' , '0')
Ответ 2
Другой способ:
DECLARE @iVal int = 1
select REPLACE(STR(@iVal, 8, 0), ' ', '0')
Ответ 3
по состоянию на SQL Server 2012 вы можете это сделать:
format(@int, '0000#')
Ответ 4
Эта работа для меня:
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
Пример:
SELECT dbo.CIntToChar(867, 6) AS COD_ID
ВЫХОД
000867
Ответ 5
Если я пытаюсь выполнить привязку к определенной общей длине, я использую функции 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, который вы начинаете с тех пор, пока он <= конечная длина строки.
Ответ 6
Я всегда использую:
SET @padded = RIGHT('z0000000000000'
+ convert(varchar(30), @myInt), 8)
Z останавливает SQL от неявного покрытия строки в int для добавления/конкатенации.
Ответ 7
Если 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
Ответ 8
Очень простой способ подумать о дополнении с помощью "0", если вы установили, что ваш @_int имеет 4 десятичных знака, вы вводите 4 '0's:
select RIGHT( '0000'+ Convert(varchar, @_int), 4) as txtnum
; если ваше фиксированное пространство равно 3, вы вводите 3'0's
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'
Ответ 9
Или, если вы действительно хотите перейти на hard-core...; -)
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
Ответ 10
А потом вот этот, используя REPLICATE:
SELECT REPLICATE('0', 7) + '1'
Конечно, вы можете заменить литералы 7 и "1" соответствующими функциями по мере необходимости; приведенное выше дает вам ваш пример. Например:
SELECT REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt)
будет помещаться целое число менее 8 мест с нулями до 8 символов.
Теперь отрицательное число во втором аргументе REPLICATE вернет NULL. Итак, если это возможно (например, @myInt может превышать 100 миллионов в приведенном выше примере), вы можете использовать COALESCE для возврата числа без начальных нулей, если их больше 8 символов:
SELECT COALESCE(REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt), CONVERT(nvarchar, @myInt))