我完全知道应用程序中的SQL查询通常使用
SET ARITHBAORT OFF
,而SSMS(默认情况下)使用SET ARITHBAORT ON
。我也相信SET ARITHBAORT OFF
只是为了向后兼容,并且真正的查询应该使用SET ARITHBAORT ON
来运行。
我有一个作为C#控制台应用程序批处理文件一部分运行的查询。上下文(默认情况下)准备好使用SET ARITHBAORT OFF
和SET ANSI_WARNINGS ON
。前92个调用都能正常执行,第93个调用总是锁定(每个调用使用不同的参数)。如果在使用第93个调用的参数之前使用SET ARITHBAORT OFF
调用存储过程,我可以在SSMS中重现这种情况。
所以接下来是我的问题(对于到目前为止的背景信息感到抱歉)...... Erland Sommarskog文章指出:
接下来,当涉及到ARITHABORT时,您应该知道,在SQL 2005和更高版本中,只要ANSI_WARNINGS为ON,此设置就没有任何影响。因此,没有理由为了这个问题而打开它。
然而,我正在使用SQL Server 2014,并发现:
SET ARITHBAORT ON
SET ANSI_WARNINGS ON
EXEC mySP -- Runs efficiently
运行良好但是存在问题
SET ARITHBAORT OFF
SET ANSI_WARNINGS ON
EXEC mySP -- Runs indefinitely
该查询运行时间无限期。因此,如果SET ANSI_WARNINGS ON
使ARITHBAORT
选项无关紧要,那么为什么我的查询会锁定呢?
SET ANSI_WARNINGS ON
。 - Chris Walsh