具有 Int 和 Decimal 转换的 SQL Server SUM 函数

标签 sql sql-server sql-server-2008

最近我在玩 SQL Server 数据类型和表中的大量数据,并试图找出 Varchar 和数字数据的性能。但是,我遇到了一些我认为不应该出现的错误,但确实如此。我的问题如下:

我有一张 table :

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

但是,当我对 Converting F1 to Int 求和时,它显示错误。
但是,当我只选择 Converting to Int 时就没问题了。
而且,当我将 Converting F1 to decimal 求和时,它工作正常。

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

我遇到以下错误

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

最佳答案

您求和为 INT,它的范围不能容纳该总和。

DECIMAL 可以。

从 1 到 99999 的所有值的总和是 4999950000,最大 INT 值是 2147483647,不到总和的一半。

当您对 INT 求和时,您将得到一个新的 INT。当您对 DECIMAL 求和时,您会得到一个新的 DECIMAL,因此输入类型定义了输出类型。

您可以改为使用 bigint,它应该“没问题”。

另外,请注意,请不要将数字存储为文本!

关于具有 Int 和 Decimal 转换的 SQL Server SUM 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17946902/

相关文章:

MySQL - 删除多个条件

sql - 同一存储过程的不同执行计划

sql-server - 使用规范化表真的更好吗?

sql-server - 如何在 SQL Server 2008 R2 中检查用户是否具有系统管理员权限

SQL Server : How to achieve re-usability yet flexibility in TSQL

java - 带参数的QueryDSL请求,可以吗?

php - 来自数据库的sql查询

php - CakePHP 数学计算领域?

java - com.microsoft.sqlserver.jdbc.SQLServerException : Login failed for user 'sa'

sql - LINKED 服务器不返回所有行