使用IF..ELSE IF控制T-SQL SP中的流程 - 还有其他方法吗?

aba*_*hev 38 sql t-sql sql-server sql-server-2008

我需要将我的T-SQL存储过程(MS SQL 2008)控制流分支到多个方向:

CREATE PROCEDURE [fooBar]
   @inputParam INT
AS
BEGIN
  IF @inputParam = 1
  BEGIN
    ...
  END
  ELSE IF @inputParam = 3
  BEGIN
    ...
  END
  ELSE IF @inputParam = 3
  BEGIN
    ...
  END
END
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?例如,在C#我shoud使用switch-case块.

Phi*_*ley 38

如果... ELSE ...就像我们在T-SQL中得到的那样.没有像结构化编程的CASE语句.如果你有一套扩展的......如果要处理,请确保为每个块包含BEGIN ... END以保持清晰,并且始终记住,一致的缩进是你的朋友!

  • 在编写将在开始和结束之间的代码之前,我总是编写我的ifs并开始和结束,稍后保存大量的调试以在任何代码插入之前放入开始结束. (16认同)
  • T-SQL案例陈述,如何说,用作"子句",其他语句的一部分 - 最常见的是SELECT语句.它们不能像在各种.NET语言中那样用于控制程序化流程. (5认同)

小智 17

您也可以尝试以SELECT CASE声明的形式表达您的答案.然后,您可以稍后创建简单的,如果需要,可以使用您的结果,因为您已经缩小了可能性.

SELECT @Result =   
CASE @inputParam   
WHEN 1 THEN 1   
WHEN 2 THEN 2   
WHEN 3 THEN 1   
ELSE 4   
END  

IF @Result = 1   
BEGIN  
...  
END  

IF @Result = 2   
BEGIN   
....  
END  

IF @Result = 4   
BEGIN   
//Error handling code   
END   
Run Code Online (Sandbox Code Playgroud)


Stu*_*rth 11

不,但在存储过程中使用IF ... ELSE ... END IF时应该小心.如果您的代码块完全不同,您可能会遇到性能不佳的原因,因为每次都需要重新缓存过程计划.如果它是一个高性能的系统,你可能想单独编译存储的特效每个代码块,并让应用程序决定在适当的时候调用哪个PROC.