Ответ 1
RIGHT('00' + CONVERT(VARCHAR, MyNumber), 2)
Будьте предупреждены, что это приведет к искажению цифp > 99. Возможно, вы захотите учитывать эту возможность.
Есть ли способ в T-SQL преобразовать TINYINT в VARCHAR с форматированием пользовательского номера? Например, у моего TINYINT есть значение 3, и я хочу преобразовать его в VARCH 03, так что он всегда показывает 2-значное число.
Я не вижу эту способность в функции CONVERT.
RIGHT('00' + CONVERT(VARCHAR, MyNumber), 2)
Будьте предупреждены, что это приведет к искажению цифp > 99. Возможно, вы захотите учитывать эту возможность.
Вы можете попробовать это
DECLARE @Table TABLE(
Val INT
)
INSERT INTO @Table SELECT 3
INSERT INTO @Table SELECT 30
DECLARE @NumberPrefix INT
SET @NumberPrefix = 2
SELECT REPLICATE('0', @NumberPrefix - LEN(Val)) + CAST(Val AS VARCHAR(10))
FROM @Table
Используйте функцию RIGHT... например.
DECLARE @testnum TINYINT
SET @testnum = 3
PRINT RIGHT('00' + CONVERT(VARCHAR(2), @testnum), 2)
Каков диапазон значений? Это от 0 до 10? Если да, попробуйте:
SELECT REPLICATE('0',2-LEN(@t)) + CAST(@t AS VARCHAR)
Это обрабатывает от 0 до 9, а также от 10 до 99.
Теперь tinyint может перейти к значению 255. Если вы хотите обрабатывать > от 99 до 255, попробуйте это решение:
declare @t TINYINT
set @t =233
SELECT ISNULL(REPLICATE('0',2-LEN(@t)),'') + CAST(@t AS VARCHAR)
Чтобы понять решение, выражение слева от + вычисляет количество нулей в префикс строки.
В случае значения 3 длина равна 1. 2 - 1 равна 1. REPLICATE Добавляет один ноль. В случае значения 10 длина равна 2. 2 - 2 равна 0. REPLICATE ничего не добавляет. В случае значения 100 длина равна -1, которая производит NULL. Однако нулевое значение обрабатывается и устанавливается в пустую строку.
Теперь, если вы решите, что, поскольку tinyint может содержать до 255, и вы хотите, чтобы ваше форматирование было тремя символами, просто измените 2-LEN на 3-LEN в левом выражении, и вы настроены.
declare @t tinyint
set @t =3
select right(replicate('0', 2) + cast(@t as varchar),2)
То же: на эффект обрезания для чисел > 99
Если вы хотите обслуживать 1-255, вы можете использовать
select right(replicate('0', 2) + cast(@t as varchar),3)
Но это даст вам 001, 010, 100 и т.д.
Здесь альтернатива, следующая за последним ответом
declare @t tinyint,@v tinyint
set @t=23
set @v=232
Select replace(str(@t,4),' ','0'),replace(str(@t,5),' ','0')
Это будет работать с любым числом и, изменяя длину функции str()
, вы можете указать, сколько нужных нулей вам нужно. Разумеется, ваша длина строки всегдa >= максимальное количество цифр, которое может содержать ваш тип номера.
Correción: 3-LEN
declare @t TINYINT
set @t =233
SELECT ISNULL(REPLICATE('0',3-LEN(@t)),'') + CAST(@t AS VARCHAR)
Имела ту же проблему с полем zipcode. Некоторые люди отправили мне файл excel с zip файлами, но они были отформатированы как #. Если бы они конвертировали их в строки, а также добавляли к ним 0, если они были < 5 len...
declare @int tinyint
set @int = 25
declare @len tinyint
set @len = 3
select right(replicate('0', @len) + cast(@int as varchar(255)), @len)
Вы просто изменяете @len, чтобы получить то, что хотите. Как отформатировано, вы получите...
001
002
...
010
011
...
255
В идеале вы также будете "varchar (@len)", но это скомпрометирует компиляцию SQL. Имейте, чтобы бросить в него фактическое # вместо var.