none
begin - end begin transaction - end RRS feed

  • Domanda

  • Sono un pò in dubbio per quel che riguarda i begin-end e begin transaction inseriti nelle mie varie stored procedure, in dubbio per quanto riguarda la quantità dei vari begin end.
    Ad esempio, ogni stored procedure inizia con un blocco begin -end preimpostato dal tool di sviluppo.
    begin

    set miaVar = ..
    set altraVar =..
    set xxx = select campo from tabella
    if xxx <> null
    begin
    --seguono due o tre istruzioni
    end

    else
    begin
    --seguono altre due o tre istruzioni
    end

    end

    quello che io faccio è inserire un blocco begin-end all'interno di un IF e di un ELSE qualora questi prevedano piu di una istruzione, un po come le parentesi graffe in linguaggio C. E' corretto fare ciò? o non è necessario?

    e infine, un'ultima cosa, si noti questo codice:

    begin transaction
    update tabella
    insert into...ecc ecc

    if @@rowcount = 0 --nessun aggiornamento, segnalo errore tramite variabile output

    if @@error = 0 commit transaction
    else rollback transaction

    Qui, a mio modo di vedere , c'è una ridondanza di errori, nel senso che mibasterebbe vedere la variabile rowcount per capire se tutto è andato liscio oppure no, senza usare quindi la transaction, dico bene..?

    lunedì 22 febbraio 2010 13:40

Tutte le risposte

  • Ad esempio, ogni stored procedure inizia con un blocco begin -end preimpostato dal tool di sviluppo.
    begin

    set miaVar = ..
    set altraVar =..
    set xxx = select campo from tabella
    if xxx <> null
    begin
    --seguono due o tre istruzioni
    end

    else
    begin
    --seguono altre due o tre istruzioni
    end

    end

    quello che io faccio è inserire un blocco begin-end all'interno di un IF e di un ELSE qualora questi prevedano piu di una istruzione, un po come le parentesi graffe in linguaggio C. E' corretto fare ciò?

    Non è solo corretto, ma obbligatorio se esegui più di una istruzione: IF...ELSE (Transact-SQL)

    begin transaction
    update tabella
    insert into...ecc ecc

    if @@rowcount = 0 --nessun aggiornamento, segnalo errore tramite variabile output

    Ti ricordo che @@rowcount restituisce il numero di righe modificate dall'ultima istruzione, pertanto nell'esempio che hai postato eseguirai un test solo sulle eventuali righe inserite.

    if @@error = 0 commit transaction
    else rollback transaction

    Qui, a mio modo di vedere , c'è una ridondanza di errori, nel senso che mibasterebbe vedere la variabile rowcount per capire se tutto è andato liscio oppure no, senza usare quindi la transaction, dico bene..?

    Ti suggerisco di leggere molto approfonditamente questo articolo di Erland (inclusi i primi due link!).

    Ciao!
    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    lunedì 22 febbraio 2010 20:53
    Moderatore
  • torno sulla questione.

    ho dato uno sguardo all'articolo, sapevo già dell'esistenza del try-catch, ma a questo punto mi chiedo:

    è piu affidabile un try-catch piuttosto che una verifica con if @@error <> 0..?

    mi sembra di capire che durante l'esecuzione di tutte le istruzioni, fondamentalmente potrebbero verificarsi "particolari" errori che non andrebbero ad incrementare il valore di @@error, ma che comunque apporterebbero modifiche magari solo ad alcune tabelle invece di tutte quelle da noi volute, rendendo così in alcuni casi risultati assolutamente incongruenti.

    E' così?

    martedì 23 febbraio 2010 20:22