将 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 时转换失败