如何将int转换为T-SQL中的零填充string?

比方说,我有一个int值为1.我怎样才能将该int转换为零填充string,如00000001

 Declare @MyInt integer Set @MyInt = 123 Declare @StrLen TinyInt Set @StrLen = 8 Select Replace(Str(@MyInt, @StrLen), ' ' , '0') 

另一种方法是:

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

从SQL Server 2012开始,现在可以这样做:

 format(@int, '0000#') 

这为我工作:

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

我创build了这个用户function

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

OUTPUT

000867

如果我试图填充特定的总长度,我使用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 

为简单起见,我在这里使用了variables,但是您可以指定总string的最后一个长度,而不用担心开始的INT的大小,只要<=最终的string长度。

我总是使用:

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

z停止SQL隐式地将string转换为用于加法/连接的整数。

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

非常简单的思考填充'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'为每个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' 

或者如果你真的想去核心… 😉

 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 

然后是这个,使用REPLICATE:

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

当然,你可以根据需要用适当的函数replace文字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))