sql >> Databáze >  >> RDS >> Sqlserver

Musím v proceduře serveru SQL použít blok try..catch a explicitní vrácení zpět?

Odpověď na vaši otázku závisí na SET XACT_ABORT nastavení:

Zkuste například následující kód. První dělení 0 vyvolá chybu, ale pokračuje v provádění . Druhé dělení nulou vyvolá chybu a zastaví provádění:

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

Pokud je XACT_ABORT ZAPNUTO, pak chyby zruší transakci a nepotřebujete TRY / CATCH.

Pokud je XACT_ABORT VYPNUTO, budete muset zkontrolovat stav každého příkazu, abyste zjistili, zda nedošlo k chybě:

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

Pokud však někdy narazíte na případ, kdy potřebujete VYZKOUŠET / CHYTIT, možná budete muset při výskytu chyby udělat něco zvláštního. Pokud ano, nezapomeňte VYZKOUŠET / ZACHYTIT zpracování výjimek:

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. Invoke-AzVMRunCommand a Start-Process pod konkrétním uživatelem na vzdáleném virtuálním počítači pomocí Azure Runbook

  2. SQL Server CTE – najít nejvyšší parentID pro každé childID?

  3. Oracle – Spustí při aktualizaci vytvoření řádku historie

  4. kam jde výstup system.out.println ve třídě Java Java