SQL Server 2019中nvarchar列科学计数法转十进制失败问题
问题分析与解决方案
核心原因:
SQL Server 的 TRY_CAST 对字符串转 DECIMAL 的规则不支持识别科学计数法(E表示法)格式的字符串;但你测试时用的 6E-06 是 FLOAT 类型的数值字面量,并非字符串,因此从 FLOAT 转 DECIMAL 可以成功。而你的 MyCol 列存储的是科学计数法格式的字符串,直接转换自然返回 NULL。
解决方案
方法1:先转FLOAT再转DECIMAL(简单高效)
利用 FLOAT 类型支持科学计数法字符串的特性,先将字符串转为 FLOAT,再转换为目标 DECIMAL 类型:
SELECT TRY_CAST(TRY_CAST(MyCol AS FLOAT) AS DECIMAL(18, 9)) AS OutCol FROM Test;
注意:转换为 FLOAT 可能存在微小精度损失,适合对精度要求不极高的场景。
方法2:手动解析科学计数法字符串(高精度场景)
通过字符串函数拆分尾数和指数部分,手动计算后转换,避免精度损失:
SELECT CASE -- 判断是否包含科学计数法标识 WHEN CHARINDEX('E', MyCol) > 0 THEN TRY_CAST( -- 拆分尾数部分 LEFT(MyCol, CHARINDEX('E', MyCol) - 1) -- 计算10的指数次方并相乘 * POWER(10.0, TRY_CAST(RIGHT(MyCol, LEN(MyCol) - CHARINDEX('E', MyCol)) AS INT)) AS DECIMAL(18, 9) ) -- 非科学计数法字符串直接转换 ELSE TRY_CAST(MyCol AS DECIMAL(18, 9)) END AS OutCol FROM Test;
若字符串存在前后空格,可先通过 LTRIM(RTRIM(MyCol)) 清理后再处理。
方法3:排查异常数据
如果仍有 NULL 返回,可先找出转换失败的具体值,分析格式问题:
SELECT MyCol FROM Test WHERE TRY_CAST(TRY_CAST(LTRIM(RTRIM(MyCol)) AS FLOAT) AS DECIMAL(18, 9)) IS NULL;
内容的提问来源于stack exchange,提问作者paone
相关产品推荐
相关产品推荐

