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

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

例如:

1转换为’001’

转换为’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

I created this user 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

例如:

选择 dbo.CIntToChar (867,6)作为 COD _ ID

输出

000867

256799 次浏览

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

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

不要对 High-Jack 提出这个问题,但需要注意的是,您需要使用(N) VARCHAR 而不是(N) CHAR 数据类型。

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

以上段,将不会产生来自 SQL2005的正确响应

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

将从 SQL2005生成所需的响应

Varchar 将动态地为您提供所需的前缀长度。 当固定长度数据类型需要长度指定和调整时。

Try this: select right('00000' + cast(Your_Field as varchar(5)), 5)

It will get the result in 5 digits, ex: 00001,...., 01234

    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)

顺便说一下,如果它是一个整型列,那么它仍然不会保持零 只需在表示层中执行,或者如果确实需要在 选择

有同样的问题,这就是我如何解决... 简单和优雅。“4”表示字符串应该有多长,不管传递的整数长度是多少,它都会填充0到“4”。

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

您还可以使用 SQLServer2012中引入的 格式()函数。 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')

我喜欢用

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


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

这给了我

000000004
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

-- Without the 'RTRIM', the value returned is 867___ !!!

SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED

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

declare @val int,@len=800
select replace(str(@val,@len),' ','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'

希望这个能帮上忙。 最好的问候

使用 RIGHT是一个不错的选择,但你也可以这样做:

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

where N is the total number of digits you want displayed. So for a 3-digit value with leading zeros (N = 3):

SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)

or alternately

SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)

这样做的目的是将所需的值加到一个大到足以产生足够的前导零的10次方上,然后去掉前导1。

The advantage of this technique is that the result will always be the same length, allowing the use of SUBSTRING instead of RIGHT, which is not available in some query languages (like HQL).

在我的例子中,我希望我的字段在10个字符的字段中有前导0(NVARCHAR (10))。 源文件没有前导0,因此不能连接到另一个表中。 这仅仅是因为在 SQLServer2008R2上:

Set Field = right ((’0000000000’+ [ Field ]) ,10) (不能使用 Format () ,因为这是在 SQL2012之前)

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

当新数据被导入并通过 Access 数据库转储到表中时,我可以使用 Format ([ Field ] ,“0000000000”)将任何新记录从 Access 附加到 SQL 服务器表中。

SQLServer2008或以上版本的单行解决方案(本质上) :

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

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

Example:

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

结果: 「000867」

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

好好享受吧