最近我正在使用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的算术溢出错误。
答案 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 }},int
或tinyint
,然后SUM返回类型smallint
的值。
转换为int
或bigint
会使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