使用ISNUMERIC()筛选后CAST转换为float仍失败是什么原因
ISNUMERIC筛选后CAST转float失败原因与解决方案
核心原因
ISNUMERIC() 函数的判定逻辑存在固有局限性:它仅判断输入内容**可以转换为任意一种SQL Server内置数值类型(含int、decimal、money等)**就返回1,并不保证内容可以直接转换为你指定的float类型。
你提供的样本值中,7372、,4899这类开头带逗号的内容,会被ISNUMERIC()判定为合法值:因为SQL Server的money类型支持开头带逗号、千位带逗号的格式,,7372可被识别为合法的货币值,所以可以通过筛选。但float类型不支持开头带逗号的格式,直接转换就会触发报错。
可落地解决方法
- 方案1:先移除字段中的逗号再转换,适配现有逻辑
SELECT CAST(REPLACE([Revenue Size (M)], ',', '') AS float) FROM Raw_Data A WHERE ISNUMERIC([Revenue Size (M)]) = 1
- 方案2:SQL Server 2012及以上版本优先使用
TRY_CAST,避免转换报错中断执行,转换失败时自动返回NULL
SELECT TRY_CAST([Revenue Size (M)] AS float) FROM Raw_Data A -- 如需过滤转换失败的行可添加下方条件 WHERE TRY_CAST([Revenue Size (M)] AS float) IS NOT NULL
- 方案3:先转换为兼容逗号格式的money类型,再转float
SELECT CAST(CAST([Revenue Size (M)] AS money) AS float) FROM Raw_Data A WHERE ISNUMERIC([Revenue Size (M)]) = 1
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

