2013-10-10 38 views
6

Aşağıdaki gibi birden fazla ifade (yaklaşık 100) kullanarak bazı T-SQL kodum var. İlk IF deyim durumu DOĞRU olarak değerlendirilirse, 99 ifadenin kalanını değerlendirir.SQL CASE İfadesi - Yerel değişkenlerin değerlerini ayarlama

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

Bunları bir CASE İfadesi kullanmak için dönüştürmek istiyorum. Ancak örneğin

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 

için ben bunu yapmak mümkün değilim ve ben VAKA İfade içinde SET kullanmayın diyor SQL hatası alıyorum.

Bunu nasıl başarabileceğime dair herhangi bir fikrim var mı? Teşekkürler!

+2

Eğer bu koşulların her biri farklı bir değişken ayarlıyorsa, başka birini kullanabilirsiniz. Soruyu doğru yazdığınızdan emin misiniz? –

+0

Çalışacak mı? SET @ var1 = VARSA DAHA SONRA ... SON ... END? – a1ex07

+3

Neden 100 farklı değişkene ihtiyacınız var? Neden sadece @ check * değerine bağlı olarak * bir * değişkeni atamadık? –

cevap

19

Case yapısı kesmeyecek: Eğer HALİNDE ile SET kullanabilirsiniz tek yolu yapmaktır:

bu sadece tek ayarlayabilirsiniz olarak sizin için çalışmaz
SET @var = CASE @check 
     WHEN 'abc' THEN @value 
     [etc] 
    END 

... değişken. Yani BAŞKA kullanmak gerekir, yani: Bu ayar 100 farklı değişkenler gibi 100 maddeleri var eğer

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

Ancak o zaman yaklaşımınız yanlış olabilir gibi geliyor: Geri adım atmak ve kendinizi sorardım neden 100 ayrı değişkene ihtiyacınız var. Çekirdek tabanlı veya geçici tablolardan okuyarak set tabanlı bir çözüm olarak yapabileceğiniz daha iyi bir şey olabilir. Ancak, yapmaya çalıştığınız şeyle ilgili daha fazla ayrıntıya ihtiyacımız var (küçük ama tamamen işe yarayan bir örnekle).

+1

+ 1. SQL'de böyle bir şey yapmaya çalışıyorsanız, muhtemelen beş adım önce yanlış bir dönüş yaptınız ... –

+0

100 iç içe ELSE IF ifadeleri yazmamayı tercih ederim. Bu SQL kodu, benim tarafımdan yazılmayan eski saklı yordamlarda. Performans için optimize etmeye çalışıyorum. – user2867911

+0

ve SQL Server 2000 saklı yordamı – user2867911

3

Chris J'nin cevabı için bir değişiklik olarak.

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 

Bildirimi "başlamak" ve "son" ifadeleri kullanılması: Aşağıdaki sözdizimini kullanın - Herkes burada başka else if veya, eğer tek dahilinde Multiple parametrelerini ayarlamak isteyen. Bu anahtar kelimeler, çoğu programlama dillerinde bulunan küme parantezlerine benzer ve belirli bir ifadede birden çok satırın belirtilmesine izin verir.

İlgili konular