SET ARITHABORT ON仍无法避免插入报错,如何不修改库级设置解决?
首先得搞清楚为什么你在存储过程里加了SET ARITHABORT ON还没解决问题——这是因为BCP发起的会话默认会继承数据库级的设置,而存储过程内部的SET语句要等存储过程执行后才生效,但涉及计算列的操作往往在会话初始化阶段就需要正确的ARITHABORT配置,所以内部的设置赶不上趟。
下面是几种不用修改数据库级设置就能解决的方案:
在BCP命令中直接前置SET语句
这是最直接的办法。你可以把SET ARITHABORT ON和存储过程调用放在同一个SQL字符串里,让BCP执行会话一开始就生效这个设置。比如:bcp "SET ARITHABORT ON; EXEC YourStagingInsertProc @YourParams;" queryout "output_file.txt" -S YourServer -D YourDB -U YourUser -P YourPass -c这样会话启动后立刻设置ARITHABORT为ON,再执行存储过程,就能满足计算列对这个设置的要求。
检查存储过程的执行上下文
确认存储过程里没有其他地方覆盖了ARITHABORT设置——比如有没有后续的SET ARITHABORT OFF语句。另外,你可以在存储过程开头加DBCC USEROPTIONS打印当前会话的参数配置,排查是否有外部因素(比如驱动、工具的默认设置)覆盖了你的SET语句。用SQLCMD替代纯BCP调用
如果BCP的查询字符串写法受限,可以用SQLCMD先执行设置语句再调用存储过程,把输出定向到文件,效果和BCP类似。比如:sqlcmd -S YourServer -d YourDB -U YourUser -P YourPass -Q "SET ARITHABORT ON; EXEC YourStagingInsertProc @YourParams;" -o "output_file.txt" -s "," -W
如果实在没办法绕开修改数据库级设置,那你需要评估启用ARITHABORT ON可能带来的风险:
旧应用兼容性问题
有些遗留应用依赖ARITHABORT OFF的行为——比如遇到除零、溢出错误时不终止执行,而是返回NULL继续运行。启用ON后,这些操作会直接抛出错误,导致旧应用崩溃或逻辑异常。执行计划变化引发的性能波动
SQL Server优化器在ARITHABORT ON时会更倾向于使用索引视图、计算列索引等优化方案,但如果你的系统中有大量旧查询是基于OFF的执行计划开发的,切换后可能出现某些查询性能下降的情况。不过从长远来看,ARITHABORT ON是微软推荐的现代SQL Server环境设置,更利于优化器生成高效计划。第三方应用冲突
如果有第三方软件连接你的数据库,它们可能没有显式设置ARITHABORT,完全依赖数据库级默认值。启用ON后,这些软件可能会抛出意料之外的错误,需要提前协调测试。
内容的提问来源于stack exchange,提问作者alerancur

