将 varchar 值“A0001”转换为数据类型 int 时转换失败

Posted

技术标签:

【中文标题】将 varchar 值“A0001”转换为数据类型 int 时转换失败【英文标题】:Conversion failed when converting the varchar value 'A0001' to data type int 【发布时间】:2015-07-09 13:17:10 【问题描述】:

使用此脚本时:

DECLARE @FORDERBZV2     varchar(20)
DECLARE @FORDERBZV          varchar(20)

SELECT  @FORDERBZV      = (SELECT TOP 1 [FOR] FROM [Mil].[dbo].[FXO] where FOR like 'T0%' order by FOR desc)

--[FOR] is declared as varchar(20)  
SELECT  @FORDERBZV2 = right (@FORDERBZV, 19) + 1

--and after i run
insert into [Mil].[dbo].[FEO]
Values (@FORDERBZV2,....)

我得到这个错误:

消息 245,第 16 级,状态 1,第 6 行 将 varchar 值“T000005571”转换为数据类型 int 时转换失败。

我不明白为什么,因为所有文件都声明为 VARCHAR(20):

FOR from [Mil].[dbo].[FXO] = VARCHAR(20)
@FORDERBZV  =  VARCHAR(20)
@FORDERBZV  =  VARCHAR(20)

此外,该脚本将正确运行一次,但当我尝试第二次运行时,我得到了错误。

【问题讨论】:

您希望如何将“A0001”转换为整数?它应该是您要转换的十六进制值吗? 字母 A 不是数字。我刚才说了吗? Select @int = convert(int, substr(@var, 2,4) ) -> 没有(安全)方法可以知道,转换为整数的 A 应该是什么(ASCII 值?字母表中的位置?程序员的鞋码?) 为什么您认为可以将“A0001”转换为整数?也许还有另一种方法可以实现您想要实现的目标。 您可以改用TRY_CONVERT (int, @var)。它不会引发错误,如果值不是整数,您将获得 NULL 值。 【参考方案1】:

所以,问题出在以下代码行:SELECT @FORDERBZV2 = right (@FORDERBZV, 19) + 1。 您收到错误的原因是您的字符串实际上不是 20 个字符长,而是更短,因此 right 函数只返回整个字符串。

我假设你想得到字母 T 后跟零填充的连续数字,所以你应该这样做:

DECLARE @FORDERBZV2     varchar(20)
DECLARE @FORDERBZV          varchar(20)

SELECT  @FORDERBZV      = (SELECT TOP 1 [FOR] 
                           FROM [Mil].[dbo].[FXO] 
                           WHERE [FOR] 
                           LIKE 'T0%' 
                           ORDER BY [FOR] DESC)

SELECT  @FORDERBZV2 = 'T' + RIGHT(
                            REPLICATE('0', LEN(@FORDERBZV)-1) + 
                            CAST (
                            CAST(RIGHT(@FORDERBZV, LEN(@FORDERBZV)-1) AS int) + 1 
                            AS varchar(20))
                            , LEN(@FORDERBZV)-1)

insert into [Mil].[dbo].[FEO]
Values (@FORDERBZV2,....)

see fiddle here.

【讨论】:

以上是关于将 varchar 值“A0001”转换为数据类型 int 时转换失败的主要内容,如果未能解决你的问题,请参考以下文章

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围的问题

将varchar值'N'转换为数据类型smallint时,转换失败。

将 varchar 值“AND ID =”转换为数据类型 int 时转换失败

将 varchar 值转换为数据类型 int 时转换失败

将 varchar 值“N”转换为数据类型 smallint 时转换失败

将 varchar 值“Collect_Date”转换为数据类型 int 时转换失败