首页 > 解决方案 > 错误:将数字转换为数字数据类型的算术溢出错误

问题描述

我收到错误:

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

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))

如何解决这个错误?

标签: sqlsql-servertsql

解决方案


首先,为什么您使用错误的数据类型并让事情变得困难,您应该始终使用正确的数据类型。

因此,而不是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

推荐阅读