T-SQL转换带千位逗号的nvarchar为decimal时出现转numeric错误
错误原因
ISNUMERIC函数判断带千位分隔逗号的数值字符串时会返回1,但CAST函数默认无法识别字符串中的逗号为千位分隔符,直接转换会触发类型转换报错。
解决方案
方案1:移除千位分隔符后转换(全版本兼容)
先通过REPLACE函数去掉Value字段中的所有逗号,再进行类型转换,兼容性最好,逻辑简单通用:
SELECT Id, IIF(ISNUMERIC(REPLACE([Value], ',', '')) = 1, CAST(REPLACE([Value], ',', '') AS DECIMAL(18, 2)), 0) AS Value FROM [dbo].[AssetLD]
如果使用SQL Server 2012及以上版本,推荐用TRY_CAST替代ISNUMERIC+CAST的组合,规避ISNUMERIC本身的误判缺陷(部分非数值特殊符号也会被ISNUMERIC判定为1):
SELECT Id, ISNULL(TRY_CAST(REPLACE([Value], ',', '') AS DECIMAL(18, 2)), 0) AS Value FROM [dbo].[AssetLD]
方案2:使用区域解析函数转换(SQL Server 2012及以上可用)
如果需要保留对千位分隔格式的校验,可使用TRY_PARSE指定对应区域规则直接解析带逗号的数值:
SELECT Id, ISNULL(TRY_PARSE([Value] AS DECIMAL(18, 2) USING 'en-US'), 0) AS Value FROM [dbo].[AssetLD]
该方案依赖区域规则,en-US区域默认将逗号识别为千位分隔符,适配你当前的数据格式。
内容的提问来源于stack exchange,提问作者ariefs
相关产品推荐
相关产品推荐

