2013-10-10 22 views
6

Mam trochę kodu T-SQL używając wielu instrukcji if (około 100) jak poniżej. Jeśli warunek pierwszej instrukcji IF ma wartość TRUE, nadal analizuje pozostałe 99 instrukcji.Wyrażenie CASE SQL - Ustawianie wartości zmiennych lokalnych

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 
… 
… 

Chcę przekonwertować te, aby użyć wyrażenia CASE. na przykład

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 

Ja jednak nie jestem w stanie to zrobić, i pojawia się błąd SQL, który mówi, że nie można używać SET w wyrażeniu CASE.

Czy ktoś ma jakieś pomysły, jak mogę to osiągnąć? Dzięki!

+2

Możesz użyć else jeśli, ale każdy z tych warunków ustawia inną zmienną. Czy na pewno poprawnie wpisałeś pytanie? –

+0

Czy to działa "SET @ var1 = CASE WHEN ... THEN ... END"? – a1ex07

+3

Dlaczego potrzebujesz 100 różnych zmiennych? Dlaczego nie wystarczy przypisać do zmiennej * one * na podstawie wartości '@ check'? –

Odpowiedz

19

Oświadczenie sprawa nie będzie go wyciąć: tylko w ten sposób można użyć zestaw z przypadkiem jest do zrobienia:

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

... który nie będzie pracować dla Ciebie, jak można to ustawić tylko jeden zmienna. Więc trzeba użyć ELSE, tj:

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 
    [...] 

Jednak jeśli masz 100 klauzul jak to ustawienie 100 różnych zmiennych, to brzmi jak twoje podejście może być nie tak: Chciałbym zrobić krok wstecz i zadać sobie dlaczego potrzebujesz 100 oddzielnych zmiennych. Może istnieć coś lepszego, co możesz zrobić jako rozwiązanie oparte na zestawie, czytając z tabel podstawowych lub tymczasowych. Jednak potrzebowalibyśmy więcej szczegółów na temat tego, co próbujesz zrobić (z małym, ale w pełni działającym przykładem).

+1

+1, szczególnie za zrobienie kroku wstecz. Jeśli próbujesz zrobić coś takiego w SQL, prawdopodobnie zrobiłeś zły obrót około pięć kroków temu ... –

+0

Wolałbym nie pisać 100 zagnieżdżonych instrukcji ELSE IF. Ten kod SQL jest w niektórych starych procedurach przechowywanych, które nie zostały napisane przeze mnie. Próbuję ją zoptymalizować pod kątem wydajności. – user2867911

+0

i procedura składowana SQL Server 2000 – user2867911

3

Jako poprawka do odpowiedzi Chrisa J. Każdy tutaj chce ustawić Multiple parametrów w ramach jednej, jeśli else if lub inny - należy użyć następującej składni:

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 

Zauważ użycie „begin” i „end” oświadczenia. Te słowa kluczowe są analogiczne do nawiasów klamrowych występujących w większości języków programowania i pozwalają na podanie wielu linii w danej instrukcji.