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

时间:2012-02-20 15:38:09

标签: sql-server execution

如果我执行此批次:

begin transaction
    PRINT 'start'
    PRINT 1/0
    PRINT 'continue'
    drop table dbo.tblPrueba
    select * from dbo.tblPrueba
    PRINT 'finish'
rollback transaction

输出是这样的:

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'.

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

Msg 8134, Level 16, State 1, Line 3
Divide by zero error encountered.

继续执行批处理

- 第二个:

drop table dbo.tblPrueba
select * from dbo.tblPrueba

这会产生此错误:

Msg 208, Level 16, State 1, Line 6
Invalid object name 'dbo.tblPrueba'.

停止执行批次

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

非常感谢!!

3 个答案:

答案 0 :(得分:10)

由于第一个错误是除零错误,this behavior depends on your ARITHABORT, ARITHIGNORE and ANSI_WARNINGS settings.

来自文章:

  

这三个SET命令可以为您提供非常精细的控制   一小组错误。当除零或溢出时,   有四种选择。

     
      
  • 根本没有任何操作,结果为NULL - 当ARITHIGNORE为ON时。
  •   
  • 警告消息,结果为NULL - 全部为OFF时。
  •   
  • 语句终止 - 当ANSI_WARNINGS为ON时。
  •   
  • 批量中止 - 当ARITHABORT为ON且ANSI_WARNINGS为OFF时。
  •   

至于哪些错误会停止执行而哪些错误停止执行,请refer to the same article

答案 1 :(得分:4)

确保正确处理所有错误的最简单方法是使用TRY / CATCH

如果没有这个,不同的错误可以是语句,范围或批量中止,具体取决于ARITHxx,ANSI_WARNINGS和XACT_ABORT等设置。这在"Error Handling in SQL 2000"

中得到了证明和讨论

您可以使用此

查看不同的(未更改SET选项)
CREATE TABLE dbo.tblPrueba (gbn int);
GO

BEGIN TRY

    begin transaction
        PRINT 'start'
        PRINT 1/0
        PRINT 'continue'
        drop table dbo.tblPrueba
        select * from dbo.tblPrueba
        PRINT 'finish'
    rollback transaction

END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
    IF XACT_STATE() <> 0 rollback transaction
END CATCH

如果我运行两次,我得到这个,因为DROP永远不会被执行

  

Msg 2714,Level 16,State 6,Line 1
  数据库中已经有一个名为'tblPrueba'的对象。

答案 2 :(得分:1)

  

我在哪里可以学习那些停止执行的内容

您可以使用异常处理


Begin try
  begin transaction
    PRINT 'start'
    PRINT 1/0
    PRINT 'continue'
    create table #t
    ( 
       id int
    )
    drop table #t
    select * from #t
    PRINT 'finish'
  rollback transaction
End Try

Begin Catch
   if( XACT_STATE() == 1)
     Rollback Tran
End Catch

您可以使用下面的Set XACT_ABORT ON

Set XACT_ABORT ON
begin transaction
    PRINT 'start'
    PRINT 1/0
    PRINT 'continue'
    create table #t
    ( 
       id int
    )
    drop table #t
    select * from #t
    PRINT 'finish'
rollback transaction