运行SQL查询时出现varchar转int类型转换失败错误该如何解决
报错原因
instruct_to_bal_avl_aft为varchar类型字段,其中存在3.0这类带小数点的字符串值,SQL Server不支持直接将带小数点的字符串转换为INT类型,因此触发类型转换失败报错。
解决方案
- 方案1:先转十进制类型再转INT
适合需要取整的业务场景,先将字符串转换为DECIMAL/FLOAT等可兼容带小数的数值类型,再转INT:
SELECT (0.01 * CAST(CAST(instruct_to_bal_avl_aft AS DECIMAL(18,2)) AS INT) ) FROM [FullYear].[dbo].[aa_momo_log]
- 方案2:直接转十进制类型计算
如果业务不需要强制取整,可省略转INT步骤,直接用十进制类型计算:
SELECT (0.01 * CAST(instruct_to_bal_avl_aft AS DECIMAL(18,2)) ) FROM [FullYear].[dbo].[aa_momo_log]
- 方案3:兼容脏数据的写法
如果字段中存在非数值的脏数据,可以用TRY_CAST避免全量查询报错,转换失败的值会返回NULL,也可以搭配ISNULL设置默认值:
-- 转换失败返回NULL SELECT (0.01 * CAST(TRY_CAST(instruct_to_bal_avl_aft AS DECIMAL(18,2)) AS INT) ) FROM [FullYear].[dbo].[aa_momo_log] -- 转换失败默认按0计算 SELECT (0.01 * ISNULL(CAST(TRY_CAST(instruct_to_bal_avl_aft AS DECIMAL(18,2)) AS INT), 0) ) FROM [FullYear].[dbo].[aa_momo_log]
如果需要控制取整逻辑,可搭配ROUND(四舍五入)、FLOOR(向下取整)、CEILING(向上取整)函数实现对应需求。
内容的提问来源于stack exchange,提问作者Dheeraj Chawla
相关产品推荐
相关产品推荐

