将数字转换为数字数据类型时出现算术溢出错误。对于小数小于 100.00 到 NUMERIC(18,2)

Arithmetic overflow error converting numeric to data type numeric. For decimal less than 100.00 to NUMERIC(18,2)

我有一个存储过程给我一个错误

Arithmetic overflow error converting numeric to data type numeric.

当我尝试运行时。我已经将其追溯到导致此问题的 3 个参数。所有 3 个值都是小于 100 的十进制值(例如 36.2 或 11.92),它们的数据类型为十进制。 SQL 中的数据类型是 NUMERIC(18, 2)。它们是从电子表格中获取的百分比值。他们都是运行通过这个方法:

//Parses Percentages or returns zero if parse fails.
public static decimal PctParseOrZero(string val)
{
    decimal newVal;
    if (val.EndsWith("%"))
    {
        if (decimal.TryParse(val.Substring(0, val.Length - 1), out newVal))
        {
            return newVal;
        }
        else
        {
            return 0;
        }
    }
    else
    {
        decimal.TryParse(val, out newVal);
        return newVal;
    }
}

当我尝试 运行 我的存储过程时,出现上述错误。为什么我会得到一个明显适合 NUMERIC(18, 2) 的值的算术溢出?

由于您没有向我们展示您的存储过程,我无法确定您尝试使用十进制值做什么。

但是,请注意,当您从 excel 中检索百分比值时,例如:36.9%,它实际上是 return 0.369.

这样,在您的示例中,即使 excel 显示值 36.2%,但它实际上传递了 0.392您的存储过程违反了 NUMERIC(18, 2)

您可以尝试修改您的代码:

if (decimal.TryParse(val.Substring(0, val.Length - 1), out newVal))
{
    return newVal;
}

至:

if (decimal.TryParse(val.Substring(0, val.Length - 1), out newVal))
{
    return newVal * 100;
}

否则,您可能需要修改存储过程以适应此