我需要将我的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
阻止。
答案 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的限制,以及GOTO和WHILE。
答案 4 :(得分:1)
Nope IF是要走的路,使用它有什么问题?
顺便说一句,你的例子将不会到达第三个代码块,因为它和第二个块完全相同。
答案 5 :(得分:-1)
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
WHEN valueN THEN resultN
[
ELSE elseResult
]
END