You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:02:43