2009-10-13 9 views
31

Ho bisogno di espandersi la mia T-SQL stored procedure (MS SQL 2008) flusso di controllo per un certo numero di direzioni:Flusso di controllo in T-SQL SP utilizzando IF..ELSE IF: ci sono altri modi?

CREATE PROCEDURE [fooBar] 
    @inputParam INT 
AS 
BEGIN 
    IF @inputParam = 1 
    BEGIN 
    ... 
    END 
    ELSE IF @inputParam = 3 
    BEGIN 
    ... 
    END 
    ELSE IF @inputParam = 3 
    BEGIN 
    ... 
    END 
END 

c'è qualche altro modo? Ad esempio, in C# utilizzare il blocco switch-case.

+0

Il BEGIN/END non è necessario a meno che non si stiano facendo più cose all'interno di quella porzione della logica decisionale. –

+0

@rexem: Sì, lo so. Ho deliberatamente scritto questo perché ogni blocco contiene molto codice – abatishchev

+11

@rexem, ogni volta che ho omesso la fine di inizio, me ne sono pentito in seguito in manutenzione quando qualcuno ha dimenticato di aggiungerli quando hanno aggiunto un secondo passaggio al ramo dell'IF. Li uso sempre adesso. – HLGEM

risposta

29

IF ... ELSE ... è più o meno quello che abbiamo in T-SQL. Non c'è niente come la dichiarazione CASE della programmazione strutturata. Se hai un set esteso di ... ELSE IF ... s da gestire, assicurati di includere BEGIN ... END per ogni blocco per mantenere le cose chiare, e ricorda sempre che il rientro coerente è tuo amico!

+14

Scrivo sempre i miei if e inizio e fine prima di scrivere il codice che andrà tra l'inizio e la fine, salva un sacco di debug in un secondo momento per inserire i fini di inizio prima di ogni codice che va in mezzo. – HLGEM

+3

È dannatamente vero. –

+0

esistono istruzioni caso in T-SQL – shradha

-1
CASE expression 
     WHEN value1 THEN result1 
     WHEN value2 THEN result2 
     ... 
     WHEN valueN THEN resultN 

     [ 
     ELSE elseResult 
     ] 
END 

http://www.4guysfromrolla.com/webtech/102704-1.shtml Per ulteriori informazioni.

+1

Questo è applicabile solo per le query. Ho bisogno di scrivere qualsiasi cosa all'interno del blocco, cioè molte righe di codice con query diverse e altre chiamate SP – abatishchev

+12

In T-SQL CASe è un ** ESPRESSIONE ** non un ramo di controllo. Animali molto diversi. –

+0

Questo è fuori dal contesto dell'istruzione SELECT. – hoggar

1

No IF è la strada da percorrere, qual è il problema con l'utilizzo?

BTW il tuo esempio non arriverà mai al terzo blocco di codice mentre questo e il secondo blocco sono esattamente uguali.

+0

Sì, questo è quello che mi serve ^) – abatishchev

8

No, ma si deve fare attenzione quando si utilizza IF ... ELSE ... END SE nei processi memorizzati. Se i blocchi di codice sono radicalmente diversi, è possibile che si verifichino delle scarse prestazioni poiché il piano della procedura dovrà essere ricollocato ogni volta. Se si tratta di un sistema ad alte prestazioni, è possibile che si desideri compilare stored proc separati per ciascun blocco di codice e richiedere all'applicazione di decidere quale proc effettuare la chiamata al momento opportuno.

+0

Questo è molto vero. Ma se la ramificazione può avvenire solo all'interno della procedura (diversamente dall'applicazione che chiama una delle varie procedure), sei ancora bloccato con una serie di istruzioni IF. –

+0

Il mio nome proc [execOperation] ha chiamato da ASP.NET FormView con il parametro dall'elenco a discesa che contiene un elenco di possibili tipi di operazione. Quindi non ho la possibilità di avere un numero di procs separati, sfortunatamente – abatishchev

13

Inoltre, puoi provare a formulare la tua risposta sotto forma di una dichiarazione SELECT CASE. È quindi possibile creare in seguito semplici se poi è che utilizzare i risultati, se necessario, come si sono ristrette le possibilità.

SELECT @Result = 
CASE @inputParam 
WHEN 1 THEN 1 
WHEN 2 THEN 2 
WHEN 3 THEN 1 
ELSE 4 
END 

IF @Result = 1 
BEGIN 
... 
END 

IF @Result = 2 
BEGIN 
.... 
END 

IF @Result = 4 
BEGIN 
//Error handling code 
END