如何将int转换为具有前导零的字符?

我需要将int数据字段转换为具有前导零的nvarchar

例:

1转换为“001”

867转换为“000867”等

谢谢。


这是我4小时后的回应…

我testing了这个T-SQL脚本,适合我!

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 

我创build了这个用户function

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

OUTPUT

000867

试试这个: select right('00000' + cast(Your_Field as varchar(5)), 5)

它会得到5位数的结果,例如:00001,…,01234

您还可以使用SQL Server 2012中引入的FORMAT()函数。 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') 

使用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) 

OUTPUT:

 0000000123 

不要高 – 杰克这个问题,但需要注意,你需要使用(N)VARCHAR,而不是(N)CHAR数据types。

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

上面的段,将不会从SQL 2005产生正确的响应

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

上面的段,将从SQL 2005产生所需的响应

varchar将为您提供所需的前缀长度。 固定长度数据types需要长度指定和调整。

数据types“int”不能超过10位数,另外“Len()”函数在整数上起作用,因此在调用len()函数之前不需要将int转换为string。

最后,你没有考虑到你的int的大小>你想要填充的位数的总数(@intLen)的情况。

因此,一个更简洁/正确的解决scheme是:

 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 

我喜欢用

 DECLARE @Length int DECLARE @Number int SET @Length = 9 SET @Number = 4 select right( POWER(10, @Length) + @Number, @Length) 

这给了我

 000000004 

我在这里find了一篇好文章:

用前导零填充string

在输出一个固定长度的数据导出时,我需要这么做很多次,例如一个数字列的长度是9个字符,而您需要以前导0作为前缀。

  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

有同样的问题,这是我如何解决…简单而优雅。 “4”是string的长度,无论长度是多less,都会填充0到“4”。

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

在我的情况下,我希望我的字段在10个字符字段(NVARCHAR(10))中具有前导0。 源文件不具有需要join到另一个表中的前导0。 这是否仅仅是由于在SQL Server 2008 R2上:

设置字段=右(('0000000000'+ [字段]),10) (不能使用格式(),因为这是SQL2012之前)

对现有数据执行此操作。 所以这样1或987654321仍然会用前导0填充全部10个空格。

由于新数据正在导入,然后通过Access数据库转储到表中,所以在从Access追加到SQL服务器表中的任何新logging时,我都可以使用Format([Field],“0000000000”)。

SQL Server 2008或更高版本的一行解决scheme( 本身 ):

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

SIGNexpression式的乘法等价于MAX(0, @DesiredLenght-LEN([Column])) 。 问题是MAX()只接受一个参数…

 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 

使用RIGHT是一个不错的select,但您也可以执行以下操作:

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

其中N是您想要显示的总位数。 因此,对于具有前导零( N = 3 )的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)中是不可用的。

这个工作适合我在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' 

希望这会有所帮助。 最好的祝福

我在想,这会对你有用吗?

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