T-SQL-将前导零转换为int的字符

T-SQL-将前导零转换为int的字符,sql,tsql,casting,Sql,Tsql,Casting,我想将带前导零的字符转换为int,例如'00010'到00010。我已尝试使用CAST或CONVERT: select CONVERT(int, '00010') 但是该函数在开始处删除零,并返回10,而不是00010。 你知道有什么简单的解决办法吗?输入的长度始终为5。从数学上讲,前导零没有意义,因此Int不能有前导零 如果需要显示前导零,则始终可以转换为varchar,并使用与right的串联,如下所示: DECLARE @MyVal int = 10; SELECT RIGHT('000

我想将带前导零的字符转换为int,例如
'00010'
00010
。我已尝试使用
CAST
CONVERT

select CONVERT(int, '00010')
但是该函数在开始处删除零,并返回
10
,而不是
00010

你知道有什么简单的解决办法吗?输入的长度始终为5。

从数学上讲,前导零没有意义,因此
Int
不能有前导零

如果需要显示前导零,则始终可以转换为
varchar
,并使用与
right
的串联,如下所示:

DECLARE @MyVal int = 10;
SELECT RIGHT('00000' + CAST(@MyVal as varchar(5)), 5)

从数学上讲,前导零是没有意义的,因此
Int
不能有前导零

如果需要显示前导零,则始终可以转换为
varchar
,并使用与
right
的串联,如下所示:

DECLARE @MyVal int = 10;
SELECT RIGHT('00000' + CAST(@MyVal as varchar(5)), 5)
应该解决问题:)


应该解决这个问题:)

您必须阅读有关数据类型的内容。
INT
注意的不仅仅是位模式。无论何时,只要您看到人类可读格式的数字,实际值就会转换为由数字组成的字符串。但此数字格式不是实际的
INT

前导零永远不是
INT
本身的一部分,但可以添加到字符串表示中。所以你的问题(字面意思)实际上没有任何意义

如果存在类似于
00012
的字符串,并且您希望将其用作数字,则应将其强制转换为:

SELECT CAST('00012' AS INT) + 2; --14
其他答案向您展示了从
INT
中获取填充字符串表示的一些方法,但这是相反的方向:

SELECT REPLACE((STR(12,5),' ','0'); --00012
您可以将这些方法结合起来:

DECLARE @PaddedNumber CHAR(5)='00012'
SELECT REPLACE(STR(CAST(@PaddedNumber AS INT) + 2,5),' ','0'); --00014

填充的数字(按类型!-字符串)被转换为
INT
,然后用于计算。结果是一个
INT
,可以将其转换为填充字符串。但是最终结果的类型是字符串…

您必须阅读有关数据类型的内容。
INT
注意的不仅仅是位模式。无论何时,只要您看到人类可读格式的数字,实际值就会转换为由数字组成的字符串。但此数字格式不是实际的
INT

前导零永远不是
INT
本身的一部分,但可以添加到字符串表示中。所以你的问题(字面意思)实际上没有任何意义

如果存在类似于
00012
的字符串,并且您希望将其用作数字,则应将其强制转换为:

SELECT CAST('00012' AS INT) + 2; --14
其他答案向您展示了从
INT
中获取填充字符串表示的一些方法,但这是相反的方向:

SELECT REPLACE((STR(12,5),' ','0'); --00012
您可以将这些方法结合起来:

DECLARE @PaddedNumber CHAR(5)='00012'
SELECT REPLACE(STR(CAST(@PaddedNumber AS INT) + 2,5),' ','0'); --00014

填充的数字(按类型!-字符串)被转换为
INT
,然后用于计算。结果是一个
INT
,可以将其转换为填充字符串。但是最终结果的类型是string…

一个
int
不能有前导零。您想做什么?请特别注意您的输入数据是“5位”还是“一个总是以5位数字显示的整数”。也就是说,如果没有对这5个数字执行任何算术运算,那么将它们转换为
INT
可能是一个值得优化的过程,或者如果将这5个数字连接到其他数字是最常见的操作,那么这可能是一个错误,会让您感到悲伤,并且它应该保持为
CHAR(5)
。(我有过这样一个系统的经验,它不正确地将数字字符串切碎为整数;这实际上会导致数据丢失。)一个
int
不能有前导零。正如霍尼獾所说。您想做什么?请特别注意您的输入数据是“5位”还是“一个总是以5位数字显示的整数”。也就是说,如果没有对这5个数字执行任何算术运算,那么将它们转换为
INT
可能是一个值得优化的过程,或者如果将这5个数字连接到其他数字是最常见的操作,那么这可能是一个错误,会让您感到悲伤,并且它应该保持为
CHAR(5)
。(我有过这样一个系统的经验,该系统不正确地将数字字符串切碎为整数;这实际上会导致数据丢失。)我知道,这是一种常用的方法。。。但如果数字可能超过给定的计数,这是危险的。我更喜欢
替换(STR(@MyVal,5),'','0')
。这将返回
******
,而不是一个错误的号码…@Shnugo你让我想。。。事实证明,常用的方法并没有那么糟糕:-)是的,在
VARCHAR(X)
中使用正确的长度就可以了。你经常会在这个地方看到一个过高的数字(因此返回错误的结果)。由于另一个原因,我更喜欢我的方法:你必须只在一个地方指定长度。易于参数化。。。上述方法需要两个位置的
5
,第三个位置的拟合计数
0
。最后是品味的问题。。。(老实说,这实际上并不是问题的答案:-D)对于Unicode类型,这种行为是“固定的”——将
CAST
转换为
N[VAR]CHAR
将产生溢出错误,而不是
*
。事实上,只有
INT
/
SMALLINT
/
TINYINT
强制转换为
CHAR
/
VARCHAR
才能得到这个结果,因此,虽然可靠(并以这样的方式记录),但仍然是有点不确定的遗留内容。我想,这完全取决于你希望如何处理你的错误。@Shnugo好吧,第一句话是答案。。。然而Jeroen在他对这个问题的评论中有一个正确的观点——也许转换成int是错误的……我知道这是一种常用的方法。。。但如果数字可能超过给定的计数,这是危险的。我更喜欢
替换(STR(@MyVal,5),'','0')
。这将是一个很好的选择