2012-02-20 37 views
5

Nếu tôi exec đợt này:Khi lỗi dừng thực thi trong SQL Server?

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

Các ouput là thế này:

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

Tôi buộc hai lỗi: - người đầu tiên: PRINT 1/0 (mà tạo ra lỗi này :

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

) Và tiếp tục thực hiện lô

- thứ hai:

drop table dbo.tblPrueba 
select * from dbo.tblPrueba 

Đó tạo ra lỗi này:

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

Và dừng thực hiện các đợt

là gì khác nhau giữa chúng? Tôi có thể tìm hiểu những người ngừng thực hiện và những người không thực hiện ở đâu?

Cảm ơn rất nhiều !!

Trả lời

9

Kể từ khi lỗi đầu tiên là một chia cho số không lỗi, this behavior depends on your ARITHABORT, ARITHIGNORE and ANSI_WARNINGS settings.

Từ bài viết:

These three SET commands give you very fine-grained control for a very small set of errors. When a division by zero or an overflow occurs, there are no less four choices.

  • No action at all, result is NULL – when ARITHIGNORE is ON.
  • Warning message, result is NULL – when all are OFF.
  • Statement-termination – when ANSI_WARNINGS is ON.
  • Batch-abortion – when ARITHABORT is ON and ANSI_WARNINGS is OFF.

As far as mà lỗi ngừng thực hiện và những người thân không, xin vui lòng refer to the same article.

4

Cách dễ nhất để đảm bảo tất cả các lỗi được xử lý một cách chính xác là sử dụng try/catch

Nếu không có này, các lỗi khác nhau có thể được tuyên bố, phạm vi hoặc hủy hàng loạt tùy thuộc vào các thiết lập như ARITHxx, ANSI_WARNINGS và XACT_ABORT. Này được chứng minh và thảo luận tại "Error Handling in SQL 2000"

Bạn có thể thấy sự khác nhau (không có tùy chọn SET thay đổi) với điều này

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 

Nếu tôi chạy này hai lần, tôi nhận được điều này bởi vì các DROP không bao giờ được thực hiện

Msg 2714, Level 16, State 6, Line 1
There is already an object named 'tblPrueba' in the database.

+0

@PankajGarg: Nếu bạn kết thúc bằng khối CATCH, tôi muốn Rollback.Tôi cũng sử dụng SET XACT_ABORT ON sẽ quay lại – gbn

1

Where can I learn those that stop execution

Bạn có thể sử dụng ngoại lệ xử lý


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 

Bạn có thể sử dụng Set XACT_ABORT ON như dưới đây.

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 
Các vấn đề liên quan