Sql server 2008 r2 在INT列上使用SUM时如何防止算术溢出错误?

Sql server 2008 r2 在INT列上使用SUM时如何防止算术溢出错误?,sql-server-2008-r2,int,sum,overflow,arithmeticexception,Sql Server 2008 R2,Int,Sum,Overflow,Arithmeticexception,我使用的是SQL Server 2008 R2,我有一个INT列,其中插入的数据永远不会超过maxINT,但我有一个查询,它使用了SUM函数,执行时超过maxINT限制,并抛出标题中提到的错误 我希望能够在不将列类型从INT更改为BIGINT的情况下执行此查询 我的问题是: SELECT UserId, SUM( PokemonExp ) AS TotalExp, MAX( PokemonLevel ) AS MaxPokeLevel

我使用的是SQL Server 2008 R2,我有一个
INT
列,其中插入的数据永远不会超过max
INT
,但我有一个查询,它使用了
SUM
函数,执行时超过max
INT
限制,并抛出标题中提到的错误

我希望能够在不将列类型从
INT
更改为
BIGINT
的情况下执行此查询

我的问题是:

SELECT    UserId,
          SUM( PokemonExp )     AS TotalExp,
          MAX( PokemonLevel )   AS MaxPokeLevel

FROM      mytable

GROUP BY  UserId
ORDER BY  TotalExp DESC
注意:PokemonExp列的类型为
INT

中的表达式类型确定返回类型

请尝试以下操作:

SELECT    UserId,
          SUM( CAST( PokemonExp AS BIGINT ))  AS TotalExp,
          MAX( PokemonLevel )                 AS MaxPokeLevel

FROM      mytable

GROUP BY  UserId
ORDER BY  TotalExp DESC
选择UserId,
SUM(将pokemonex转换为BIGINT)作为TotalExp,
MAX(PokemonLevel)作为MaxPokeLevel
从mytable
按用户ID分组
按TotalExp DESC订购

您无需将列类型更改为
BIGINT
即可获得适当的总和

只需将
CAST
转换为
pokemonex
BIGINT
,然后执行
SUM
如下操作:

SUM(将pokemonex转换为BIGINT))

SUM中接受的表达式类型决定返回类型

请尝试以下操作:

SELECT    UserId,
          SUM( CAST( PokemonExp AS BIGINT ))  AS TotalExp,
          MAX( PokemonLevel )                 AS MaxPokeLevel

FROM      mytable

GROUP BY  UserId
ORDER BY  TotalExp DESC

就其价值而言,AVG似乎也发生了同样的情况,即使它只是溢出的值的总和。
是否将结果强制转换为
BIGINT
,这与OP想要的相反?