SQL CASE表达式 - 设置局部变量的值

use*_*911 9 sql t-sql sql-server sql-server-2000 case

我有一些使用多个if语句(大约100)的T-SQL代码,如下所示.如果第一个IF语句条件的计算结果为TRUE,它仍会评估99个语句的其余部分.

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
…
…
Run Code Online (Sandbox Code Playgroud)

我想将它们转换为使用CASE表达式.例如

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
Run Code Online (Sandbox Code Playgroud)

但是,我无法这样做,我得到一个SQL错误,说我不能在CASE表达式中使用SET.

有没有人有任何想法我怎么能做到这一点?谢谢!

Chr*_*s J 23

case语句不会削减它:你可以使用SET和CASE的唯一方法是:

SET @var = CASE @check
       WHEN 'abc' THEN @value
       [etc]
    END
Run Code Online (Sandbox Code Playgroud)

...这对你不起作用,因为这只能设置一个变量.所以你需要使用ELSE,即:

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
   [...]
Run Code Online (Sandbox Code Playgroud)

但是,如果您有100个这样的条款设置100个不同的变量,那么听起来您的方法可能是错误的:我退后一步,问问自己为什么需要100个单独的变量.作为基于集合的解决方案,您可以做更好的事情,从核心或临时表读取.但是我们需要更多关于你要做什么的细节(有一个小但完全正常的例子).

  • 通常,优化性能的唯一方法是从轨道上进行核心和重写.这是唯一确定的方法.我已经不知道有多少次我必须做到这一点...... (2认同)