Tsql ARITHABORT,ARITHIGNORE-我需要重新打开它们吗?

Tsql ARITHABORT,ARITHIGNORE-我需要重新打开它们吗?,tsql,stored-procedures,error-handling,azure-sql-database,Tsql,Stored Procedures,Error Handling,Azure Sql Database,这可能从根本上说是愚蠢的,但下面是: 我有一个存储过程,我需要在不抛出溢出错误的情况下运行它。如果出现溢出,我很乐意使用空值 我看到互联网(如和)上到处都有人建议只使用它 SET ARITHABORT OFF; SET ARITHIGNORE ON; 这很好,但是我是否应该在SP结束时重新打开它们 SET ARITHABORT ON; SET ARITHIGNORE OFF; 像这样?这些都是默认值吗 另外,我是否需要两个开关来让它忽略溢出错误(在我的例子中,尝试将“606006000”放在

这可能从根本上说是愚蠢的,但下面是:

我有一个存储过程,我需要在不抛出溢出错误的情况下运行它。如果出现溢出,我很乐意使用空值

我看到互联网(如和)上到处都有人建议只使用它

SET ARITHABORT OFF;
SET ARITHIGNORE ON;
这很好,但是我是否应该在SP结束时重新打开它们

SET ARITHABORT ON;
SET ARITHIGNORE OFF;
像这样?这些都是默认值吗

另外,我是否需要两个开关来让它忽略溢出错误(在我的例子中,尝试将“606006000”放在SMALLINT字段中)


正在使用Azure DB v12。

有关这些设置的一些信息。默认情况下,这两种设置都是正确的

设置算术规则:
SET ARITHIGNORE设置仅控制是否返回错误消息。SQL Server在涉及溢出或被零除错误的计算中返回NULL,而不考虑此设置

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

此外,这是关于这些问题的更多说明

此设置不影响INSERT、UPDATE和DELETE语句期间发生的错误。 如果SET ARITHABORT或SET ARITHIGNORE处于禁用状态且SET ANSIU WARNINGS处于启用状态,则SQL Server在遇到被零除或溢出错误时仍会返回错误消息

我做了一些测试,似乎设置Aritingnore只够满足你需要的行为

此外,您还需要将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

不需要。指示在登录会话时应始终将ARITHABORT设置为ON,“在登录会话中应始终将ARITHABORT设置为ON”。这意味着其会话特定。更好的澄清:请注意,它会影响会话,因此只要您在下一次查询之前释放会话并获得新会话,它就会被重置automatically@xQbert谢谢,第二个网站是一个很好的阅读。将此作为答案发布,我会接受。@xQbert Yep,来自您的第二个链接:“如果在存储过程或触发器中运行SET语句,则从存储过程或触发器返回控制后,SET选项的值将恢复。”谢谢,我的google fu今天很弱。谢谢您的详细解释。这解释了为什么我最终无法让它工作——我也需要ANSI_警告。