错误:将数字转换为数据类型数字的算术溢出错误

时间:2019-01-11 07:07:24

标签: sql sql-server tsql

我遇到错误:

  

将数字转换为数据类型数字的算术溢出错误   在下面的代码上。

declare @A as   nvarchar(100)   --will be Nvarchar only
    declare @T as   nvarchar(100)     --will be Nvarchar only
    declare @Act as nvarchar(100) --will be Nvarchar only
    set @A ='750000'
    set @T ='552000'

    SELECT  @Act = cast(cast(cast(@A  AS decimal(10, 4)) -cast( @T AS decimal(10, 4)) 
    /cast(@T AS decimal(10, 4)) AS decimal(10, 4)) * 100 AS numeric(10, 4))

如何克服这个错误?

4 个答案:

答案 0 :(得分:1)

首先,为什么要使用错误的数据类型并使您的工作变得困难,所以应该始终使用正确的数据类型。

因此,为什么不使用VARCHAR而不是DECIMAL,这仍然是查询,因为您的问题是如何解决此错误

declare @A as   nvarchar(100)   --will be Nvarchar only
    declare @T as   nvarchar(100)     --will be Nvarchar only
    declare @Act as nvarchar(100) --will be Nvarchar only
    set @A ='750000'
    set @T ='552000'


SELECT @Act = CAST(
                    (
                      CAST(@A AS DECIMAL(10,4))-
                      CAST(@T AS DECIMAL(10,4))
                    ) /
                    (CAST(@T AS DECIMAL(10,4)) * 100)
                  AS VARCHAR);
SELECT @Act

无需强制转换AS numeric(10, 4),而您需要强制转换为VARCHAR,因为您是将值分配给varchar变量,而不是数字变量。

如果您更改数据类型,您的查询将很容易,例如:

DECLARE @A DECIMAL(10,4) = 750000,
        @T DECIMAL(10,4) = 552000,
        @Act VARCHAR(100);

SELECT @Act = CAST((@A - @T) / (@T * 100) AS VARCHAR(100))

SELECT @Act

或者如果您要将结果强制转换为numeric(10, 4)

DECLARE @A DECIMAL(10,4) = 750000,
        @T DECIMAL(10,4) = 552000,
        @Act VARCHAR(100);

SELECT @Act = CAST(CAST((@A - @T) / (@T * 100) AS numeric(10, 4)) AS VARCHAR(100))

SELECT @Act

答案 1 :(得分:0)

您需要提高精度值。 尝试这样更改:

declare @A as   nvarchar(100)   --will be Nvarchar only
    declare @T as   nvarchar(100)     --will be Nvarchar only
    declare @Act as nvarchar(100) --will be Nvarchar only
    set @A ='750000'
    set @T ='552000'

    SELECT  @Act = cast(cast(cast(@A  AS decimal(18, 2)) -cast( @T AS decimal(18, 4)) 
    /cast(@T AS decimal(18, 4)) AS decimal(18, 4)) * 100 AS numeric(18, 4))

    print @Act

答案 2 :(得分:0)

出现错误是因为

  

您提供的电话号码的总长度大于10。

您可以将下面的代码item.addEventListener('click', throttled(2000, (e) => func(e.target))); 更改为10, 4

18, 4

它的值大于最大限制,所以它给出了异常。

答案 3 :(得分:0)

如果我正确理解了您的逻辑,那么您想做什么:

SELECT @Act = 
    cast(
        cast(
            cast(@A  AS decimal(10, 4)) - 
            cast(@T AS decimal(10, 4)) / cast(@T AS decimal(10, 4)) 
        AS decimal(10, 4)) 
        * 100
    AS numeric(10, 4))

是这个简单的计算:

SELECT @Act = (@N1 - @N2/@N2) * 100

然后,根据您的情况,您需要将@Act强制转换为numeric(12, 4),因为您乘以100。结果将是:74999900.0000

我不确定,但是我认为您可能要计算:

SELECT @Act = (@N1 - @N2)/@N2 * 100

即使这样,通常也要始终考虑数学计算的范围,并为变量使用适当的数字数据类型。