如果我执行此批次:
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'.
停止执行批次
他们之间有什么不同?我在哪里可以学习那些停止执行的东西和那些没有执行的东西?
非常感谢!!
答案 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