2016-01-29 24 views
1

有没有一种方法(除了将i转换为bigint之类的东西),以避免下面一组语句中的算术溢出错误?避免集合函数的算术溢出

DECLARE @tbl TABLE ([i] INT); 

INSERT INTO @tbl 
     ([i]) 
VALUES (POWER(2, 30)), 
     (POWER(2, 30)); 

SELECT SUM([t].[i]) 
FROM @tbl AS [t]; 

我在SUM()尝试了TRY_CAST()但似乎错误是在该点之前发生的事情。如果在溢出时返回NULL(或任何其他值),我很好。

回答

3

铸造到bigint前聚集,然后try_casting结果回INT最好是把我

但是,没有一个方法是

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF 

    DECLARE @tbl TABLE ([i] INT); 

    INSERT INTO @tbl 
      ([i]) 
    VALUES (POWER(2, 30)), 
      (POWER(2, 30)); 

    SELECT SUM([t].[i]) 
    FROM @tbl AS [t]; 

SQL Fiddle

+0

我今天新学到了一些东西。 – SQLChao

+0

需要注意的是[*将ARITHABORT设置为OFF会对导致性能问题的查询优化产生负面影响。](https://msdn.microsoft.com/en-us/library/ms190306.aspx#Anchor_1)您应该真的在寻找另一种避免算术溢出的方法。 –

+0

@TT。它可以防止计算列上的索引视图和索引被匹配,但如果没有使用这些索引,则不会对查询优化产生任何其他负面影响。文章中的警告是关于此设置的值不匹配使故障排除变得更加困难,因为具有不同值的这些选项的不同会话不能共享彼此的计划,因此可能会出现参数嗅探问题,只会出现在应用程序使用的计划中,然后在SSMS中运行都可以正常工作。 –