Welcome to Sign in | Help
in Search

Tranzactie cu RAISERROR

Last post 11-09-2010, 9:35 PM by B_gd_n[ ]Sahlean. 6 replies.
Sort Posts: Previous Next
  •  11-08-2010, 3:14 PM 8469

    Tranzactie cu RAISERROR

    Desi nu prea este indicat sa se foloseasca cursoare nu am avut de ales si a trebuit sa folosesc :(
    Am o procedura care apeleaza alte 2 proceduri.
    Arata ceva de genul
    BEGIN TRANSACTION
    declare cursor for ...
    open cursor
    fetch next ...
    while @@FETCHSTATUS = 0
    BEGIN
    exec SProc
    fetch next ...
    END
    close cursor
    deallocate cursor
    declare altcursor for ...
    open altcursor
    fetch next ...
    while @@FETCHSTATUS = 0
    BEGIN
    exec altSProc
    fetch next ...
    END
    close altcursor
    deallocate altcursor
    COMMIT TRANSACTION
    IF @@ERROR <> 0
    ROLLBACK TRANSACTION

    In altSProc am un RAISERROR si as vrea sa nu se comita transactia, numai ca ea se comite.
    Cum ar trebui sa fac sa nu se mai comita nimic ?
    Multumesc

    Sorin Sandu
  •  11-08-2010, 3:51 PM 8470 in reply to 8469

    Re: Tranzactie cu RAISERROR

    este de la "COMMIT TRANSACTION".

    Ce nu inteleg este de ce folosesti cursoare ? daca cumva procedurile tale sunt proceduri ce intorc date, poti face atfel:
    DECLARE @a table (col1 tip1, .., colN tipN)
    DECLARE @b table (col1 tip1, .., colN tipN)

    BEGIN TRAN

    begin try

    insert into @a
    exec SProc

    insert into @b
    exec altSProc

    commit tran

    end try
    begin catch

    raiserror(....)
    rollback

    end catch

     

    Adica incepi o tranzactie, se executa codul din begin try si end try si daca a ajuns la final, se executa ultima linie ...adica COMMIT. Daca pe undeva a dat eroare, intra pe catch si executa rollback.

    O alta metoda este ca dupa executia procedurilor sa verifici @@error. Acolo unde ai tu in codul tau, practic, verifici daca COMMIT-ul s-a executat. @@error se seteaza la fiecare instructiune executata, adica vei testa daca a fost eroare la instructiunea precedenta. 

     

     


    Cătălin D.
  •  11-08-2010, 4:39 PM 8471 in reply to 8470

    Re: Tranzactie cu RAISERROR

    Procedurile alea doar insereaza si se executa de mai multe ori (cat tine cursorul).

    Sorin Sandu
  •  11-08-2010, 11:18 PM 8472 in reply to 8471

    Re: Tranzactie cu RAISERROR

    Conform BOL, @@ERROR întoarce codul de eroare doar pentru ultima instrucțiune/comandă SQL executată. În esență, dacă folosiți funcția @@ERROR atunci trebuie să verificați existența unei erori după fiecare execuție a unei instrucțiuni/comenzi SQL incluzând aici fiecare apel de procedură stocată:
    ...
    EXECUTE procedura1
    IF @@ERROR <> 0
        ROLLBACK ...
    ...
    EXECUTE procedura2
    IF @@ERROR <> 0
        ROLLBACK ...

    Dacă folosiți SQL 2000 citiți aceste materiale publicate de către Erland Sommarskog: [1] & [2].
    Dacă folosiți SQL 2005, 2008 [R2] atunci este interesant acest articol. Plecând de la ultimul articol puteți să construiți un șablon de procedură stocată (citiți și comentariile), șablon pe care să-l utilizați pentru implementarea tuturor procedurilor stocate.
  •  11-09-2010, 7:56 AM 8473 in reply to 8472

    Re: Tranzactie cu RAISERROR

    Multumesc
    Asta era !

    Sorin Sandu
  •  11-09-2010, 10:20 AM 8474 in reply to 8472

    Re: Tranzactie cu RAISERROR

    Bogdan
    Ai cumva sablonul complet?Marturisesc ca am inteles ideile, dar ... nu am inteles codul...

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  11-09-2010, 9:35 PM 8475 in reply to 8474

    Re: Tranzactie cu RAISERROR

    Articolul este la următoarea adresă:
    http://blogs.msdn.com/b/anthonybloesch/archive/2009/03/10/sql-server-error-handling-best-practice.aspx

    La sfârșitul articolului este un script SQL care conține câteva exemple. Scriptul conține șablonul pentru proceduri stocate.

    Completare: și BOL conține un astfel de șablon: TRY...CATCH (Transact-SQL) (secțiunea: C. Using TRY…CATCH with XACT_STATE).
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems