Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Трябва ли да използвам блок try..catch и изрично връщане назад в процедура на SQL Server?

Отговорът на вашия въпрос зависи от SET XACT_ABORT настройка:

Например, опитайте следния код. Първото деление на 0 поражда грешка, но продължава изпълнението . Второто деление на нула поражда грешка и спира изпълнението:

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

Ако XACT_ABORT е ON, тогава грешките ще прекъснат транзакцията и нямате нужда от TRY / CATCH.

Ако XACT_ABORT е ИЗКЛЮЧЕНО, ще трябва да проверите състоянието на всеки оператор, за да видите дали е възникнала грешка:

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

Въпреки това, ако някога откриете случай, в който трябва да ОПИТАТ/УЛОВЯТ, може да се наложи да направите нещо специално, когато възникне грешката. Ако е така, не забравяйте да ИЗПИТВАТЕ/УЛОВАТЕ обработката на изключение:

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 и HashBytes

  2. Базирани на функции индекси в SQL Server

  3. Множество индекси срещу индекси с няколко колони

  4. Разбиране на таймаутите на транзакциите

  5. Защо изпълнението на съхранени процедури е по-бързо от SQL заявката от скрипт?