具有Int和Decimal Conversion的Sql Server SUM函数

时间:2013-07-30 12:21:18

标签: sql sql-server sql-server-2008

最近我正在使用SQL Server数据类型,并将大量数据放入表中,并尝试使用Varchar和Numeric数据计算出性能。但是,我得到了一些错误,我认为不应该是这样,但事实确实如此。我的问题如下:

我有一张桌子:

create table sa(f1 varchar(100))

我有一个存储过程,它将100000个数据插入表中:

create proc sad
as
begin
    declare @i int=0
    while @i<100000
    begin
       insert into sa values(@i)
       set @i=@i+1
    end
end


exec sad

我测试了以下内容:

select CONVERT(int,f1) from sa  //Works Fine, i tested after the Problem
select sum(convert(int,f1)) from sa  //Didn't Worked, So i tested above and Below
select sum(convert(decimal(18,2),f1)) from sa //And, it again works fine

但是,当我总结将F1转换为Int时,它会显示错误 但是,当我只选择转换为Int它的罚款 而且,当我将F1转换为十进制时,它的工作正常。

SUM函数数据类型是什么?
在Above数据上,它适用于Decimal而不是Int?
为什么呢?

我得到以下错误

将表达式转换为数据类型int的算术溢出错误。

4 个答案:

答案 0 :(得分:7)

你总结为INT,其范围无法保持该总和。

DECIMAL可以。

从1到99999的所有值之和为4999950000,最大INT值为2147483647,小于总和最终值的一半。

当您汇总INT时,您将获得一个新的INT。当你对DECIMAL求和时,你得到一个新的DECIMAL,所以输入类型定义了输出类型。

您可以切换为使用bigint代替它,它应该“很好”。

另外,在第二个注释中,请不要将数字存储为文本

答案 1 :(得分:4)

根据MS文档(参见https://docs.microsoft.com/en-us/sql/t-sql/functions/sum-transact-sql),SUM()函数根据要添加的列的数据类型返回不同类型的值:如果列的类型为{{1 }},inttinyint,然后SUM返回类型smallint的值。

转换为intbigint会使decimal返回更大的数据类型,这就解释了为什么在这种情况下您没有溢出。

答案 2 :(得分:2)

预计您已超过SQL Server允许的最大int值(2,147,483,647) - 请参阅https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql

十进制允许更高的限制,最高可达10 ^ 38 - 1(即1后有38个零) - 请参阅https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql

但是,如果值为int类型,我建议您不要转换为decimal。当您在小数点后面有可能的数字且具有已知的精度和比例(例如货币,百分比等)时,Decimal值非常有用。正如另一张海报所建议的那样,这里最好的转换是{bigint 1}}:

select sum(cast(f1 as bigint)) from sa

答案 3 :(得分:0)

看起来你的结果总和对于int来说太大了,请使用bigint,同时检查int, bigint, smallint, and tinyint (Transact-SQL)

select sum(convert(bigint,f1)) from sa