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

时间:2010-03-07 17:32:14

标签: sql-server stored-procedures

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

示例:

1转换为'001'

867转换为'000867'等

THX。


这是我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

我创建了这个用户功能

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

17 个答案:

答案 0 :(得分:84)

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

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

答案 1 :(得分:45)

您还可以使用 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')

答案 2 :(得分: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)

输出:

0000000123

答案 3 :(得分:13)

不要高 - 杰克这个问题,但需要注意你需要使用(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将为您提供所需的前缀长度。 固定长度数据类型需要长度指定和调整的地方。

答案 4 :(得分:4)

我喜欢用

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

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

这给了我

000000004

答案 5 :(得分:4)

数据类型“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

答案 6 :(得分:2)

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()只接受一个参数......

答案 7 :(得分:2)

不是很优雅,但是我添加了一个设置值,其中我希望转换的数字具有相同数量的前导零,并使用RIGHT函数。

示例:

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

结果:&#39; 000867&#39;

答案 8 :(得分:1)

    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

答案 9 :(得分:1)

有同样的问题,这就是我解决的问题......简单而优雅。 “4”是字符串应该有多长,无论传递什么长度的整数,它都将填充零,最多为“4”。

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

答案 10 :(得分:1)

我找到了一篇好文章here

  

用前导零填充字符串

     

我需要做很多次   输出固定长度数据时   导出例如数字   列长9个字符,你   需要以前导0的前缀为前缀。

答案 11 :(得分:1)

在我的情况下,我希望我的字段在10个字符字段中具有前导0(NVARCHAR(10))。 源文件没有前导0,然后加入另一个表。 这仅仅是因为在SQL Server 2008R2上:

设置Field = right(('0000000000'+ [Field]),10)(不能使用Format(),因为这是SQL2012之前的版本)

针对现有数据执行此操作。所以这种方式1或987654321仍将用前导0填充所有10个空格。

正在导入新数据&amp;然后通过Access数据库转储到表中,当从Access向SQL服务器表追加任何新记录时,我可以使用Format([Field],“0000000000”)。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

我在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'

希望这会有所帮助。 最好的问候

答案 14 :(得分:0)

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

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)中是不可用的。 / p>

答案 15 :(得分:0)

在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)

享受

答案 16 :(得分:-2)

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

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