如何在T-SQL中将int转换为零填充字符串?

时间:2008-11-21 15:47:26

标签: sql tsql

假设我有一个值为1的int。如何将该int转换为零填充字符串,例如00000001

12 个答案:

答案 0 :(得分:39)

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

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

答案 1 :(得分:35)

另一种方式是:

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

答案 2 :(得分:31)

从SQL Server 2012开始,您现在可以执行此操作:

format(@int, '0000#')

答案 3 :(得分:9)

这项工作对我来说:

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

答案 4 :(得分:1)

如果我试图填充特定的总长度,我会使用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的大小,只要它是&lt; =最后的字符串长度。< / p>

答案 5 :(得分:1)

我总是使用:

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

z阻止SQL将字符串隐式转换为int以进行添加/连接。

答案 6 :(得分:1)

如果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

答案 7 :(得分:1)

考虑使用'0'进行填充的非常直接的方法是,如果你将@ _int固定为4位小数,则注入4'0:

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

如果您的固定空间是3,则注入3'0's

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

在下面我注入'00'为每个bldg生成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'

答案 8 :(得分:1)

使用FORMAT(<your number>,'00000000')使用尽可能多的零,以便在最终结果中包含数字。

Here is official documentation of the FORMAT function

答案 9 :(得分:0)

或者,如果你真的想要去核心...; - )

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 :(得分:0)

然后就是这个,使用REPLICATE:

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

当然,你可以根据需要用适当的函数替换文字7和'1';以上为您举例。例如:

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

将填充少于8个位的整数,最多为8个字符的零。

现在,REPLICATE的第二个参数中的负数将返回NULL。所以,如果这是可能的(例如,@ myInt在上面的例子中可能超过1亿),那么如果超过8个字符,你可以使用COALESCE返回数字而不带前导零:

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

答案 11 :(得分:0)

我认为Charles Bretana的回答是最简单,最快捷的。不使用STR的类似解决方案是:

SELECT REPLACE(REVERSE(
        CONVERT(CHAR(5 /*<= Target length*/)
                , REVERSE(CONVERT(VARCHAR(100), @MyInt)))
     ), ' ', '0')