当错误在SQL Server中停止执行时?

use*_*392 5 sql-server execution

如果我执行此批次:

begin transaction
    PRINT 'start'
    PRINT 1/0
    PRINT 'continue'
    drop table dbo.tblPrueba
    select * from dbo.tblPrueba
    PRINT 'finish'
rollback transaction
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

start
Msg 8134, Level 16, State 1, Line 3
Divide by zero error encountered.
continue
Msg 208, Level 16, State 1, Line 6
Invalid object name 'dbo.tblPrueba'.
Run Code Online (Sandbox Code Playgroud)

我强迫两个错误: - 第一个:PRINT 1/0(生成此错误:

Msg 8134, Level 16, State 1, Line 3
Divide by zero error encountered.
Run Code Online (Sandbox Code Playgroud)

)并继续执行批处理

- 第二个:

drop table dbo.tblPrueba
select * from dbo.tblPrueba
Run Code Online (Sandbox Code Playgroud)

这会产生此错误:

Msg 208, Level 16, State 1, Line 6
Invalid object name 'dbo.tblPrueba'.
Run Code Online (Sandbox Code Playgroud)

并停止执行批处理

他们之间有什么不同?我在哪里可以学习停止执行的那些和那些没有执行的?

非常感谢!!

Mic*_*son 10

由于第一个错误是除零错误,此行为取决于您的ARITHABORT,ARITHIGNORE和ANSI_WARNINGS设置.

来自文章:

这三个SET命令可以为一小组错误提供非常细粒度的控制.当除零或溢出发生时,有四个选择.

  • 完全没有动作,结果为NULL - 当ARITHIGNORE为ON时.
  • 警告消息,结果为NULL - 全部为OFF时.
  • 语句终止 - ANSI_WARNINGS为ON时.
  • 批量中止 - 当ARITHABORT为ON且ANSI_WARNINGS为OFF时.

至于哪些错误停止执行以及哪些错误不执行,请参阅同一篇文章.