Как преобразовать int в char с ведущими нулями?

Мне нужно преобразовать int data field в nvarchar с ведущими нулями

Пример:

1 конвертировать в '001'

867 конвертировать в '000867' и т.д.

ТНХ.


Это мой ответ 4 часа спустя...

Я тестировал этот T-SQL Script и отлично работал у меня!

DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED

SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED

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

Код T-SQL:

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

    -- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number

    -- @intlen contains the string size to return
    IF @intlen > 20
       SET @intlen = 20

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

END

Пример:

SELECT dbo.CIntToChar(867, 6) AS COD_ID

ВЫХОД

000867

Ответ 1

Попробуйте следующее: select right('00000' + cast(Your_Field as varchar(5)), 5)

Он получит результат в 5 цифр, например: 00001,...., 01234

Ответ 2

Вы также можете использовать функцию FORMAT(), представленную в SQL Server 2012. http://technet.microsoft.com/library/hh213505.aspx

DECLARE @number1 INT, @number2 INT

SET @number1 = 1
SET @number2 = 867

SELECT FORMAT(@number1, 'd10')
SELECT FORMAT(@number2, 'd10')

Ответ 3

Используйте REPLICATE, поэтому вам не нужно жестко кодировать все начальные нули:

DECLARE @InputStr int
       ,@Size     int
SELECT @InputStr=123
      ,@Size=10

PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)

ВЫВОД:

0000000123

Ответ 4

Не для этого важного вопроса, но нужно отметить, что вам нужно использовать (N) VARCHAR вместо (N) CHAR типа данных.

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )

Над сегментом не будет выдаваться правильный ответ от SQL 2005

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )

Над сегментом вы получите требуемый ответ от SQL 2005

. varchar предоставит вам нужную длину префикса на лету. Если для типа данных фиксированной длины потребуется обозначение и корректировка длины.

Ответ 5

Мне нравится использовать

DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4

select right( POWER(10, @Length) + @Number, @Length)

это дает мне

000000004

Ответ 6

Тип данных "int" не может быть больше 10 цифр, кроме того, функция "Len()" работает на int, поэтому нет необходимости преобразовывать int в строку перед вызовом функции len().

Наконец, вы не учитываете случай, когда размер вашего int > содержит общее количество цифр, которое вы хотите заполнить (@intLen).

Поэтому более кратким/правильным решением является:

CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
AS
BEGIN
    IF @intlen > 20 SET @intlen = 20
    IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
    RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
END

Ответ 7

Не очень элегантно, но я добавляю заданное значение с тем же числом начальных нулей, которое я желаю, к числовому значению, которое я хочу преобразовать, и использую функцию RIGHT.

Пример:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)

Result: '000867'

Ответ 8

Однострочное решение (как таковое) для SQL Server 2008 или выше:

DECLARE @DesiredLenght INT = 20;
SELECT 
    CONCAT(
        REPLICATE(
            '0',
            (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
        [Column])
FROM Table;

Умножение на выражение SIGN эквивалентно MAX(0, @DesiredLenght-LEN([Column])). Проблема в том, что MAX() принимает только один аргумент...

Ответ 9

Я нашел хорошую статью здесь:

Заполнение строки с ведущими нулями

Мне нужно делать это много раз при выводе данных фиксированной длины экспортировать, где, например, числовое столбец длиной 9 символов, и вы необходимо префикс с ведущими 0.

Ответ 10

    select right('000' + convert(varchar(3),id),3) from table

    example
    declare @i int
    select @i =1

select right('000' + convert(varchar(3),@i),3)

Кстати, если это столбец int, то он все равно не сохранит нули Просто сделайте это на уровне презентации или если вам действительно нужно в SELECT

Ответ 11

У той же проблемы, вот как я решил... Простой и элегантный. "4" - как долго должна быть строка, независимо от того, какая длина целого передается, она будет заполняться нулем до "4".

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))

Ответ 12

В моем случае я хотел, чтобы в моем поле было ведущее поле 0 в 10 символов (NVARCHAR (10)). Исходный файл не имеет ведущего 0, необходимого для присоединения к другой таблице. Это просто из-за того, что на SQL Server 2008R2:

Set Field = right (('0000000000' + [Field]), 10) (не может использовать Format(), поскольку это пред SQL2012)

Выполнено это против существующих данных. Таким образом, этот способ 1 или 987654321 будет по-прежнему заполнять все 10 пробелов ведущими 0.

Когда новые данные импортируются и затем сбрасываются в таблицу через базу данных Access, я могу использовать Format ([Field], "0000000000" ) при добавлении из Access в таблицу SQL Server для любых новых записей.

Ответ 13

DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- Без "RTRIM" возвращаемое значение 3__!!!

SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED

- Без "RTRIM" возвращаемое значение 867___!!!

SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED

Ответ 14

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

FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
  RETURNS varchar(255) CHARSET utf8
BEGIN
  return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
END

Например:

leadingZero('000',999); returns '999'
leadingZero('0000',999); returns '0999'
leadingZero('xxxx',999); returns 'x999'

Надеюсь, это поможет. С наилучшими пожеланиями

Ответ 15

Использование RIGHT является хорошим вариантом, но вы также можете сделать следующее:

SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)

где N - общее количество цифр, которые вы хотите отобразить. Итак, для 3-значного значения с ведущими нулями (N = 3):

SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)

или поочередно

SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)

То, что это делает, - это добавление желаемого значения к мощности 10, достаточно большой, чтобы генерировать достаточное количество начальных нулей, а затем отрубать ведущий 1.

Преимущество этого метода заключается в том, что результат всегда будет такой же длины, что позволяет использовать SUBSTRING вместо RIGHT, который недоступен на некоторых языках запросов (например, HQL).

Ответ 16

Работает в SQLServer

declare @myNumber int = 123
declare @leadingChar varchar(1) = '0'
declare @numberOfLeadingChars int = 5

select right(REPLICATE ( @leadingChar , @numberOfLeadingChars ) + cast(@myNumber as varchar(max)), @numberOfLeadingChars)

Enjoy

Ответ 17

Мне было интересно, будет ли это для вас польза?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')