Sql server 避免聚合函数上的算术溢出

Sql server 避免聚合函数上的算术溢出,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,有没有办法(除了将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\u CAST(),但似乎错误发生在该点之前。如果在溢出时

有没有办法(除了将
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\u CAST()
,但似乎错误发生在该点之前。如果在溢出时返回NULL(或任何其他值),我很好。

在聚合之前强制转换为
bigint
,然后尝试将结果强制转换回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];

重要的是要注意,您确实应该寻找另一种方法来避免算术溢出。@TT。它可以防止索引视图和计算列上的索引被匹配,但如果不使用它们,则不会对查询优化产生任何其他负面影响。文章中的警告是关于此设置的值不匹配,这使得故障排除更加困难,由于这些选项具有不同值的不同会话无法共享彼此的计划,因此可能会出现参数嗅探问题,该问题只会出现在应用程序使用的计划中,然后在SSMS中运行,一切正常。@MartinSmith您可能不知道这方面的官方链接,对吗?我一直很想知道这件事。