在Transact-SQL中终止IF块

时间:2013-04-22 15:24:37

标签: sql-server sql-server-2008-r2

这可能是一个相当新的问题,但我无法在MSDN中找到如何在Transact-SQL中结束IF / ELSE块的示例。例如,我想创建一个执行此操作的SP:

USE [MyDb];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE PROCEDURE [dbo].[usp_MyStoredProc]
@param1 DATE, @param2 INT, @param3 BIT, @param4 [dbo].[CustomDataType] READONLY
WITH EXEC AS CALLER
AS
-- Only run this part if @param3 == true
IF (@param3 = 1)
   BEGIN
     --do stuff...
   END
-- I don't really need an else here, as I'm simply doing an 
-- extra step at the beginning if my param tells me to

-- I always want this next part to run...
-- do more stuff...
GO

我有一个我认为有效的解决方案(在下面发布的答案),但我觉得我正在解决我缺乏知识而不是做最好的模式。

编辑 - 我删除了我的第一个解决方案,因为这是一个可怕的想法,并且不希望其他人尝试实现它。原来问题实际上是这种情况下的解决方案;感谢所有人。

2 个答案:

答案 0 :(得分:2)

IF语句的语法是

IF Boolean_expression 
     { sql_statement | statement_block } 
[ ELSE 
     { sql_statement | statement_block } ] 

ELSE部分是可选的。

“sql_statement”是任何单个语句。 “statement_block”是包含在BEGINEND

中的一组语句

更多详情:http://msdn.microsoft.com/en-us/library/ms182717.aspx

答案 1 :(得分:2)

没有其他声明。如果满足IF条件,那么BEGIN / END之间的任何内容都将运行,之后SQL将正常进行。它与以下内容相同:

If (x == 1) {
   // condition met, do stuff
}
// do more stuff

你真的很亲密。只是需要一些调整。

IF (@param3 = 1)
  BEGIN
  -- do stuff if a param tells me to (has to be done before main block of code is ran below)
  END    
-- do stuff that should always be ran.
GO

让自己和你的团队受宠:永远不要使用goto,除非它是100%必要的。通常,对于结构良好的代码,它们不是必需的。