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

时间:2009-10-13 18:41:29

标签: sql sql-server tsql 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

还有其他方法吗?例如,在C#我应该使用switch-case阻止。

6 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:16)

您也可以尝试以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   

答案 2 :(得分:11)

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

答案 3 :(得分:2)

这是关于control structures in T-SQL的限制,以及GOTOWHILE

答案 4 :(得分:1)

Nope IF是要走的路,使用它有什么问题?

顺便说一句,你的例子将不会到达第三个代码块,因为它和第二个块完全相同。

答案 5 :(得分:-1)

CASE expression
      WHEN value1 THEN result1
      WHEN value2 THEN result2
      ...
      WHEN valueN THEN resultN

      [
        ELSE elseResult
      ]
END

http://www.4guysfromrolla.com/webtech/102704-1.shtml了解更多信息。