如何将int转换为带有前导零的char?

Ric*_*lda 92 sql-server stored-procedures

我需要将int datafield转换为带有前导零的nvarchar

例:

1转换为'001'

867转换为'000867'等

谢谢.


这是我4小时后的回复......

我测试了这个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
Run Code Online (Sandbox Code Playgroud)

我创建了这个用户功能

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
Run Code Online (Sandbox Code Playgroud)

示例:

SELECT dbo.CIntToChar(867,6)AS COD_ID

OUTPUT

000867

小智 89

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

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

  • 请注意,对于 postgres,您需要将 + 替换为 ||,因此```select right('00000' || cas​​t(Your_Field as varchar(5)), 5)``` (2认同)

小智 54

您还可以使用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')
Run Code Online (Sandbox Code Playgroud)

  • 刚刚测试了 FORMAT Sql Server 2012 - 它很慢,就像“每几秒一个数字”一样慢。远离。 (2认同)
  • @DiomedesDomínguez已经一年了,所以我不再有原始测试。我只是在一个非常快的服务器上运行了另一个测试,却花了32秒格式化一百万个数字。不是世界末日,而是Nguyen Tran发布的解决方案在1秒钟内完成了任务。要进行测试,只需创建一个从@i int = 0到10000000的循环。 (2认同)

KM.*_*KM. 21

使用,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)
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

0000000123
Run Code Online (Sandbox Code Playgroud)


Gol*_*hop 13

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

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )
Run Code Online (Sandbox Code Playgroud)

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

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )
Run Code Online (Sandbox Code Playgroud)

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

varchar将为您提供所需的前缀长度.固定长度数据类型需要长度指定和调整的地方.


C.L*_*ist 5

数据类型“int”不能超过10位,另外“Len()”函数对int起作用,所以在调用len()函数之前不需要将int转换为字符串。

最后,您没有考虑 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
Run Code Online (Sandbox Code Playgroud)


小智 5

我喜欢用

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

select right( POWER(10, @Length) + @Number, @Length)
Run Code Online (Sandbox Code Playgroud)

这给了我

000000004
Run Code Online (Sandbox Code Playgroud)

  • 我也喜欢这个。如果 Length 是硬编码的,你可以只使用 `RIGHT(1000+Number, 3)` - 好、短、快 (3认同)
  • 感觉有点 hacky,但它在 DB2 中对我有用。我无法得到上面的答案。 (2认同)
  • 这适用于 2005 年以后的所有 SQL Server 变体。首选答案。 (2认同)
  • 10是什么意思? (2认同)
  • @Fandango68 上面 'POWER(10, @Length)' 中的 '10' 是因为我们使用基数为 10 的算术 - 所以上面 maf-soft 答案中的 '1000' 文字相当于 POWER(10, 3) - 10^3 = 1000。 (2认同)

小智 5

不是很优雅,但我添加了一个与我想要转换的数字相同数量的前导零的设置值,并使用 RIGHT 函数。

例子:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)
Run Code Online (Sandbox Code Playgroud)

结果:'000867'