2016-07-05 105 views
2

这可能从根本上是愚蠢的,但这里有:ARITHABORT,ARITHIGNORE - 是否需要关闭它?

我有一个存储的过程,我只需要运行而不会引发溢出错误。如果发生溢出,我很满意NULL。

我看到它建议各地互联网(如herehere)只使用

SET ARITHABORT OFF; 
SET ARITHIGNORE ON; 

这很好,但要我一样,在我的SP的最后再将其打开?

SET ARITHABORT ON; 
SET ARITHIGNORE OFF; 

是这样的?这些甚至是默认值吗?

另外,我是否需要两个开关来让它忽略溢出错误(在我的情况下,试图把'606006000'放在一个SMALLINT字段中)?

使用Azure DB v12。

+0

应该不需要。 https://msdn.microsoft.com/en-us/library/ms190306.aspx表示在登录会话中ARITHABORT应始终设置为ON,“您应始终在登录会话中将ARITHABORT设置为ON”。这意味着它的会话具体。更好的说明:https://msdn.microsoft.com/en-us/library/ms190356.aspx注意它会影响SESSION,所以只要你在下次查询之前释放会话并获得新会话,它就会被重置自动 – xQbert

+0

@xQbert谢谢,第二个网站是一个很好的阅读。发布此作为答案我会接受它。 – vacip

+1

@xQbert Yep,从第二个链接:“如果在存储过程或触发器中运行SET语句,SET存储过程或触发器返回控制后,SET选项的值将恢复。谢谢,我的google-fu今天很虚弱。 – vacip

回答

1

有关这些设置的一些信息。默认情况下都是如此。

SET ARITHIGNORE:
的SET ARITHIGNORE设置仅是否返回一个错误消息的控制。 SQL Server返回在的计算的NULL涉及溢出或除以零误差,不论该设置

SET ARITHABORT的:
的SET ARITHABORT设置可被用于确定该查询是否终止

而且这是MSDN不得不说的这些更多..

此设置不会影响INSERT,UPDATE过程中出现的错误,和DELETE语句。 如果SET ARITHABORT或SET ARITHIGNORE为OFF且SET ANSI_WARNINGS为ON,则在遇到零除或溢出错误时,SQL Server仍会返回错误消息。

我做了一些testings,似乎 SET ARITHIGNORE OFF设置只足够你需要的行为..

而且你还需要设置SET_ANSI_WARNINGS_OFF为好,其他明智的,这将抛出错误

SET ARITHABORT OFF 
--SET ARITHIGNORE OFF 
SET ANSI_WARNINGS OFF 

select 1/0 

declare @a tinyint 
set @a=10000 
select @a 
+1

谢谢你的详细解释。这解释了为什么我最终无法实现它 - 我还需要ANSI_WARNINGS。 – vacip

相关问题