执行报错:数据类型 varchar 转换为 float 时出错?

update ExpGtsApplyBillDBTemp set zextenditemfield7=
(
case when right(upper(zextenditemfield2),2)='WH' and zextenditemfield2 like '%/%'
then round(cast(substring(upper(zextenditemfield2),charindex('/',upper(zextenditemfield2))+1,charindex('WH',upper(zextenditemfield2))-charindex('/',upper(zextenditemfield2))-1) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),2)='WH' and zextenditemfield2 not like '%/%' and upper(zextenditemfield2) like '%AH%'
then round(cast(substring(upper(zextenditemfield2),charindex('AH',upper(zextenditemfield2))+2,charindex('WH',upper(zextenditemfield2))-charindex('AH',upper(zextenditemfield2))-2) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),1) in ('W')
then round(cast(left(zextenditemfield2,Len(zextenditemfield2)-1) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),2) in ('WH') and upper(zextenditemfield2) not like '%AH%'
then round(cast(left(zextenditemfield2,Len(zextenditemfield2)-2) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),2)='AH' and upper(zextenditemfield2) not like '%MAH%'
then round(cast(left(zextenditemfield1,Len(zextenditemfield1)-1) as float)*cast(left(zextenditemfield2,Len(zextenditemfield2)-2) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),2)='AH' and upper(zextenditemfield2) like '%MAH%' and right(upper(zextenditemfield2),3)!='MAH'
then round(cast(left(zextenditemfield1,Len(zextenditemfield1)-1) as float)*cast(substring(upper(zextenditemfield2),charindex('MAH',upper(zextenditemfield2))+3,Len(zextenditemfield2)-2-charindex('MAH',upper(zextenditemfield2))-2) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),3)='MAH' and replace(upper(zextenditemfield2),'MAH','') like '%AH%'
then round(cast(left(zextenditemfield1,Len(zextenditemfield1)-1) as float)*cast(left(zextenditemfield2,charindex('AH',upper(zextenditemfield2))-1) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),3)='MAH' and replace(upper(zextenditemfield2),'MAH','') not like '%AH%'
then round(cast(left(zextenditemfield1,Len(zextenditemfield1)-1) as float)*0.001*cast(left(zextenditemfield2,Len(zextenditemfield2)-3) as float)/zextenditemfield6,0)

when right(upper(zextenditemfield2),4)='MAH/' and replace(upper(zextenditemfield2),'MAH/','') not like '%AH%'
then round(cast(left(zextenditemfield1,Len(zextenditemfield1)-1) as float)*0.001*cast(left(zextenditemfield2,Len(zextenditemfield2)-4) as float)/zextenditemfield6,0)
end
)
where isnull(failorsucce,'0')='0' and isnull(zextenditemfield6,'0')!='0' and isnull(zextenditemfield7,'0')='0'

这个错误通常是因为在将一个 varchar 类型的值转换为 float 类型时,数据中包含非数字字符或格式不正确的数字字符。
您可以在 case 语句中逐个调试每个条件来确定具体的问题,例如,尝试分别执行以下 SQL 语句:
SELECT CAST('abc' AS float) -- 错误:无法将字符串“abc”转换为 float 类型。
SELECT CAST('123' AS float) -- 正确:将字符串“123”转换为 float 类型。
SELECT CAST('12.3' AS float) -- 正确:将字符串“12.3”转换为 float 类型。
此外,还有可能是由于数据中的空值或其他未处理的异常数据导致的问题。您可以使用 ISNUMERIC() 函数来检查值是否可以转换为数字。例如:
SELECT ISNUMERIC('abc') -- 返回 0,即不能转换为数字。
SELECT ISNUMERIC('123') -- 返回 1,即可以转换为数字。
SELECT ISNUMERIC('12.3') -- 返回 1,即可以转换为数字。
在执行更新语句之前,建议先备份数据并测试语句的有效性。如果问题仍然存在,您可以提供更多的信息和数据样本,以便更深入地进行诊断。
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜