2012-06-21 29 views
8

Tôi đã đọc về xử lý lỗi trong SQL Server trong this article và họ đề xuất sử dụng GOTO của SQL Server trong một số trường hợp nhất định để quay lại giao dịch. Ví dụ:Thực hành không tốt để sử dụng GOTO của SQL Server để xử lý lỗi?

BEGIN TRAN 
    UPDATE Authors 
    SET Phone = '415 354-9866' 
    WHERE au_id = '724-80-9391' 

    SELECT @intErrorCode = @@ERROR 
    IF (@intErrorCode <> 0) GOTO PROBLEM 

    UPDATE Publishers 
    SET city = 'Calcutta', country = 'India' 
    WHERE pub_id = '9999' 

    SELECT @intErrorCode = @@ERROR 
    IF (@intErrorCode <> 0) GOTO PROBLEM 
COMMIT TRAN 

PROBLEM: 
IF (@intErrorCode <> 0) BEGIN 
PRINT 'Unexpected error occurred!' 
    ROLLBACK TRAN 
END 

Bài viết này được viết gần 10 năm trước và tôi đã nghe nói rằng sử dụng GOTO thường là một ý tưởng tồi. Ở trên là một phương pháp ok để xử lý lỗi trong SQL Server? Nếu không, bất cứ ai có thể đề xuất một lựa chọn tốt hơn?

+0

Bạn đã kiểm tra này [trả lời] (http://stackoverflow.com/a/ 11153012/1451723)? – Pankaj

Trả lời

15

Bạn nên sử dụng Try/Catch trong SQL 2005+

BEGIN TRY 
    BEGIN TRAN 

    UPDATE Authors 
    SET Phone = '415 354-9866' 
    WHERE au_id = '724-80-9391' 

    UPDATE Publishers 
    SET city = 'Calcutta', country = 'India' 
    WHERE pub_id = '9999' 

    COMMIT TRAN   
END TRY 
BEGIN CATCH 
    PRINT 'Unexpected error occurred!' 
    IF XACT_STATE() <> 0 
     ROLLBACK TRAN  
END CATCH 
5

Bạn phải kết hợp chặt chẽ SET XACT_ABORT ON trong Exception handling

Begin Try 
SET XACT_ABORT ON 

BEGIN TRAN 
    UPDATE Authors 
    SET Phone = '415 354-9866' 
    WHERE au_id = '724-80-9391' 

    UPDATE Publishers 
    SET city = 'Calcutta', country = 'India' 
    WHERE pub_id = '9999' 
COMMIT TRAN 

End Try 

Begin Catch 
    Rollback Tran 
End Catch 
Các vấn đề liên quan