2013-10-10 36 views
6

我有一些使用多个if语句(大约100)的T-SQL代码,如下所示。如果第一个IF语句条件评估为TRUE,它仍然评估99条语句的其余部分。SQL CASE表达式 - 设置局部变量的值

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

我想将它们转换为使用CASE表达式。对于e.g

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 

但是,我不能这样做,我得到的是说我不能使用CASE表达式中设置一个SQL错误。

有没有人有任何想法我可以做到这一点?谢谢!

+2

如果你可以使用else,但是,其中每个条件都设置了一个不同的变量。你确定你输入的问题正确吗? –

+0

它会工作吗?SET @ var1 = CASE when ... then ... END'? – a1ex07

+3

为什么你需要100个不同的变量?为什么不根据'@ check'的值分配给* one *变量? –

回答

19

case语句将不会削减它:你可以用CASE设置使用的唯一的办法就是要做到:

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

...这将不会为你工作,因为这只能设置一个变量。所以你需要使用别的,即:

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

但是如果你已经有了100个条款是这样设置100个不同的变量,那么它听起来像你的做法可能是错误的:我会退后一步,问问自己为什么你需要100个单独的变量。作为基于集合的解决方案,您可以做的更好,无论是从核心表还是临时表读取。但是,我们需要更多关于你想要做什么的细节(用一个小而全面的工作例子)。

+1

+1,尤其是退后一步。如果你试图在SQL中做这样的事情,你可能在五步之前做了错误的转变...... –

+0

我宁愿不写100个嵌套的ELSE IF语句。此SQL代码位于某些不是由我编写的旧存储过程中。我正在试图优化它的性能。 – user2867911

+0

及其SQL Server 2000存储过程 – user2867911

3

作为Chris J的答案的修正。有人在这里寻求建立参数内的单个如果,否则,如果要不 - 使用下面的语法:

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 

注意使用“开始”和“结束”语句。这些关键字与大多数编程语言中的花括号相似,并允许在给定语句中指定多行。