Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apakah saya perlu menggunakan blok try..catch, dan rollback eksplisit dalam prosedur SQL Server?

Jawaban atas pertanyaan Anda bergantung pada SET XACT_ABORT pengaturan:

Misalnya, coba kode berikut. Pembagian pertama dengan 0 menimbulkan kesalahan tetapi melanjutkan eksekusi . Pembagian kedua dengan nol menimbulkan kesalahan dan menghentikan eksekusi:

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

Jika XACT_ABORT AKTIF, maka kesalahan akan membatalkan transaksi, dan Anda tidak perlu TRY/CATCH.

Jika XACT_ABORT OFF, Anda perlu memeriksa status setiap pernyataan untuk melihat apakah terjadi kesalahan:

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

Namun, jika Anda pernah menemukan kasus di mana Anda perlu MENCOBA / CATCH, Anda mungkin perlu melakukan sesuatu yang khusus ketika kesalahan terjadi. Jika demikian, jangan lupa untuk MENCOBA/MENANGKAP penanganan pengecualian:

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. Sql server 2008 memaksa tanggal dari dd/MM/yyyy ke MM/dd/yyyy

  2. Lupa Kata Sandi SQL Server

  3. Buat Pekerjaan Agen SQL Server menggunakan SSMS

  4. Bagaimana cara menghitung total jam perjalanan antara kota x dan y dan sebaliknya

  5. Teks terpotong atau satu atau lebih karakter tidak cocok di halaman kode target Saat mengimpor dari file Excel