none
"SELECT CASE" vs "IF ... ELSE" e delucidazioni su "BEGIN ... END" RRS feed

  • Domanda

  • Purtroppo ho ancora poche esperienze con t-sql e devo scrivere una stored.

    Questo è il mio codice:

    USE myDatabase
    GO
      
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [dbo].[myStored]
    (
    @myPar1 INT,
    @myPar2 SMALLDATETIME
    )
    
    AS
    
    BEGIN
      SET NOCOUNT ON
    
      IF EXISTS (
                SELECT 
                1 
        
                FROM 
                myTable1 
       
                WHERE 
                myPar1 = @myPar1
                AND myPar2 = @myPar2
                )
    
        BEGIN
          DELETE FROM  
          myTable1  
       
          WHERE 
          myPar1 = @myPar1
          AND myPar2 = @myPar2
        END
    
      ELSE 
    
        IF EXISTS (
                  SELECT 
                  1 
          
                  FROM 
                  myTable2 
         
                  WHERE 
                  myPar2 = @myPar2
                  )
    
          BEGIN
            INSERT INTO  
            myTable1
            (myField1, myField2, myField3, myField4)
      
            VALUES
            (@myPar1, @myPar2, '', 1)
          END    
    
        ELSE
    
          IF EXISTS (
                    SELECT 
                    1 
          
                    FROM 
                    myTable3 
         
                    WHERE 
                    myPar2 = @myPar2
                    )
    
            BEGIN
              INSERT INTO  
              myTable1
              (myField1, myField2, myField3, myField4)
        
              VALUES
              (@myPar1, @myPar2, '', 1)
            END
    END
    

    E queste sono le mie domande:

    1 - Ci sono errori macroscopici?

    2 - Qualcuno suggerisce di usare "SELECT CASE", qualcun altro di usare " IF ... ELSE ", qual è la differenza? E qual è l'opzione migliore nel mio caso?

    3 - Non sono sicuro di aver usato correttamente l'istruzione "BEGIN ... END". A cosa serve? E' sempre opportuno inserirla - come ho fatto io - all'interno dell'istruzione "IF ... ELSE"? Mi sono fatto l'idea che serva ad evitare problemi quando devono essere eseguite una serie di istruzioni in sequenza, quindi nel mio caso non dovrebbe servire perché dopo "IF" io eseguo soltanto un'istruzione "INSERT" o "DELETE", però ho visto in giro delle query simili che hanno "BEGIN" dentro "IF" e mi sono confuso...

    Erminio

    mercoledì 18 dicembre 2013 22:13

Risposte

  • 1 - non lo so :-) hai provato il parser SQL di SSMS ?

    2 - usi SELECT CASE quando i casi da analizzare (cioè i valori che può assumere il parametro discriminante) sono più di due altrimenti usi IF...ELSE. questa scelta è consigliata dal fatto che altrimenti, nel caso il parametro possa assumere più di due valori, con l'IF ... ELSE dovresti nidificare più IF...ELSE

    3 - BEGIN END si usa sempre quando le righe di codice tra begin e and sono più di una, altrimenti è possibile omettere BEGIN END. dipende in quale modo il codice ti risulta più leggibile oltre al fatto di risparmiare di scrivere.

    ciao


    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org


    giovedì 19 dicembre 2013 14:41
    Moderatore