2013-10-10 16 views
6

Ho un codice T-SQL che utilizza più istruzioni if ​​(circa 100) come di seguito. Se la prima condizione dell'istruzione IF viene valutata su TRUE, valuta ancora il resto di 99 istruzioni.SQL CASE Expression - Impostazione dei valori delle variabili locali

IF(@check = 'abc') SET @var1 = @value 
IF(@check = 'def') SET @var2 = @value 
IF(@check = 'ghi') SET @var3 = @value 
IF(@check = 'jkl') SET @var4 = @value 
IF(@check = 'mno') SET @var5 = @value 
… 
… 

Voglio convertirli per usare un'espressione CASE. per es

CASE @check 
    WHEN 'abc' THEN SET @var1 = @value 
    WHEN 'def' THEN SET @var2 = @value 
    WHEN 'ghi' THEN SET @var3 = @value 
    WHEN 'jkl' THEN SET @var4 = @value 
    WHEN 'mno' THEN SET @var5 = @value 
    … 
    … 
END 

Tuttavia, io non sono in grado di farlo, e ottengo un errore SQL che dice che non posso utilizzare SET all'interno di un'espressione CASE.

Qualcuno ha qualche idea su come posso raggiungere questo obiettivo? Grazie!

+2

È possibile utilizzare altro se, ma, ognuna di queste condizioni sta impostando una variabile diversa. Sei sicuro di aver digitato correttamente la domanda? –

+0

Funzionerà 'SET @ var1 = CASO QUANDO ... POI ... FINE'? – a1ex07

+3

Perché hai bisogno di 100 variabili diverse? Perché non basta assegnare a * una * variabile in base al valore di '@ check'? –

risposta

19

Una dichiarazione caso non è tagliato: l'unico modo è possibile utilizzare insieme con il caso è quello di fare:

SET @var = CASE @check 
     WHEN 'abc' THEN @value 
     [etc] 
    END 

... che non funziona per voi come questo può impostare solo un singolo variabile. Quindi è necessario utilizzare ELSE, vale a dire:

IF (@check = 'abc') SET @var1 = @value 
ELSE IF (@check = 'def') SET @var2 = @value 
ELSE IF (@check = 'ghi') SET @var3 = @value 
ELSE IF (@check = 'jkl') SET @var4 = @value 
ELSE IF (@check = 'mno') SET @var5 = @value 
    [...] 

Tuttavia, se hai 100 clausole come questa impostazione 100 diverse variabili allora suona come il vostro approccio può essere sbagliato: mi piacerebbe prendere un passo indietro e chiedetevi perché hai bisogno di 100 variabili separate. Potrebbe esserci qualcosa di meglio che puoi fare come soluzione basata su set, leggendo dal core o da tabelle temporanee. Tuttavia avremmo bisogno di maggiori dettagli su ciò che stai cercando di fare (con un esempio piccolo, ma pienamente funzionante).

+1

+1, soprattutto per fare un passo indietro. Se stai cercando di fare qualcosa di simile in SQL, probabilmente hai preso una svolta sbagliata circa cinque passi fa ... –

+0

Preferirei non scrivere 100 istruzioni ELSE IF annidate. Questo codice SQL è in alcune vecchie stored procedure non scritte da me. Sto cercando di ottimizzarlo per le prestazioni. – user2867911

+0

ed è la stored procedure di SQL Server 2000 – user2867911

3

Come ammendamento alla risposta di Chris J. Chiunque qui in cerca di impostare MULTIPLA parametri all'interno di un singolo caso, altrimenti se oppure - utilizzare la seguente sintassi:

IF (@check = 'abc') 
    begin 
     SET @var1 = @value 
     SET @var2 = @value 
    end 
ELSE IF (@check = 'def') 
    begin 
     SET @var1 = @value 
     SET @var2 = @value 
    end 
ELSE IF (@check = 'ghi') 
    begin 
     SET @var1 = @value 
     SET @var2 = @value 
    end 
ELSE IF (@check = 'jkl') 
    begin 
     SET @var1 = @value 
     SET @var2 = @value 
    end 
ELSE IF (@check = 'mno') 
    begin 
     SET @var1 = @value 
     SET @var2 = @value 
    end 

Avviso l'uso di dichiarazioni "end" "begin" e. Queste parole chiave sono analoghe alle parentesi graffe trovate nella maggior parte dei linguaggi di programmazione e consentono di specificare più righe in una determinata istruzione.