Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tôi có cần sử dụng khối try..catch và khôi phục rõ ràng trong quy trình SQL Server không?

Câu trả lời cho câu hỏi của bạn phụ thuộc vào SET XACT_ABORT cài đặt:

Ví dụ, hãy thử đoạn mã sau. Phép chia đầu tiên cho 0 gây ra lỗi nhưng vẫn tiếp tục thực thi . Phép chia thứ hai cho 0 gây ra lỗi và tạm dừng thực thi:

begin transaction

set xact_abort off
    
select 1 / 0 -- causes divide by zero error, but continues
select @@trancount -- returns 1

set xact_abort on

select 1 / 0 -- causes divide by zero error and terminates execution
select @@trancount -- we never get here

rollback

Nếu XACT_ABORT BẬT, thì lỗi sẽ hủy bỏ giao dịch và bạn không cần THỬ / MÈO.

Nếu XACT_ABORT TẮT, bạn sẽ cần kiểm tra trạng thái của từng câu lệnh để xem có lỗi xảy ra không:

begin transaction

delete from...
if @@error <> 0
begin
    if @@trancount > 0
        rollback
    return
end

insert into...
if @@error <> 0
begin
    if @@trancount > 0
        rollback
    return
end

commit

Tuy nhiên, nếu bạn từng tìm thấy trường hợp cần THỬ / MÈO, bạn có thể cần phải làm điều gì đó đặc biệt khi lỗi xảy ra. Nếu vậy, đừng quên THỬ / MÈO xử lý ngoại lệ:

begin transaction

set xact_abort on

begin try
    select 1 / 0 -- causes divide by zero error and terminates execution
    select @@trancount -- we never get here
    commit
end try
begin catch
    select xact_state() -- this will be -1 indicating you MUST rollback before doing any other operations
    select @@trancount -- this will probably be one, because we haven't ended the transaction yet
    if xact_state() <> 0
    begin try
        select 'rollback'
        rollback
        
        -- do something to handle or record the error before leaving the current scope
        select 'exception processing here'
        --insert into...
    end try
    begin catch
        -- ignore rollback errors
    end catch
    
end catch


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sửa đổi công việc tác nhân máy chủ SQL (T-SQL)

  2. Các gói SSIS được lưu ở đâu?

  3. Làm thế nào để loại bỏ ràng buộc mặc định của SQL mà không cần biết tên của nó?

  4. Lưu trữ dữ liệu XML trong SQL Server

  5. KHÔNG CÓ VÀ KHÔNG TỒN TẠI