简体   繁体   English

在存储过程中嵌套if语句

[英]Nesting if-statements inside stored procedure

I'm creating a stored procedure which needs to check several conditions, and depending on the outcome has to execute specific queries. 我正在创建一个存储过程,该过程需要检查几个条件,并根据结果执行特定的查询。 I have trouble when it comes to nested IF-statements, and I really can't seem to figure out what's wrong with the syntax. 对于嵌套的IF语句,我遇到了麻烦,而且我似乎真的无法弄清楚语法出了什么问题。

Here's a snippet of my code (the rest is pretty much the same, but with other values) 这是我的代码的一部分(其余部分几乎相同,但带有其他值)

 IF @periodeKD = 'Formiddag'
  IF @Ugedagnr = '1'
        BEGIN TRANSACTION
                    @ModulID = 'S1'
                    @ModulID2 = 'S2'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
        COMMIT TRANSACTION
  IF @Ugedagnr = '2'
        BEGIN TRANSACTION
                    @ModulID = 'S5'
                    @ModulID2 = 'S6'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
        COMMIT TRANSACTION
  IF @Ugedagnr = '3'
        BEGIN TRANSACTION
                    @ModulID = 'S9'
                    @ModulID2 = 'S10'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
        COMMIT TRANSACTION
  IF @Ugedagnr = '4'
        BEGIN TRANSACTION
                    @ModulID = 'S13'
                    @ModulID2 = 'S14'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
        COMMIT TRANSACTION
  IF @Ugedagnr = '5'
        BEGIN TRANSACTION
                    @ModulID = 'S17'
                    @ModulID2 = 'S18'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
        COMMIT TRANSACTION

It keeps complaining about the second IF-statement after the first one (IF @Ugedagnr = '1'). 它一直在抱怨第一个IF语句之后的第二个IF语句(IF @Ugedagnr ='1')。

How are nested IF-statements written? 嵌套的IF语句如何编写?

IF @periodeKD = 'Formiddag'
BEGIN
  IF @Ugedagnr = '1'
  BEGIN
        BEGIN TRANSACTION
                    SET @ModulID = 'S1'
                    SET @ModulID2 = 'S2'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
        COMMIT TRANSACTION
  END
  ELSE
  IF @Ugedagnr = '2'
  BEGIN
        BEGIN TRANSACTION
                    SET @ModulID = 'S5'
                    SET @ModulID2 = 'S6'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
        COMMIT TRANSACTION
  END
  ELSE
  ...
END

Note, syntax @ModulID = 'S1' is illegal. 注意,语法@ModulID = 'S1'是非法的。 Use SET @ModulID = 'S1' . 使用SET @ModulID = 'S1'

Mapping between @Ugedagnr and @Modul* can be easily implemented via map table and single select instead of bunch of IFs. @Ugedagnr@Modul*之间的映射可以通过映射表和单选而不是一堆IF轻松实现。

Since you are checking one variable against multiple conditions, therefore, you should use something like this Here the block of code where the condition is true will be executed and other blocks will be ignored. 因此,由于您要针对多个条件检查一个变量,因此,您应该使用类似这样的代码。这里将执行条件为真的代码块,而其他块将被忽略。

IF (@ParentVar1 Condition1)
Begin
       IF(@Var1 Condition1)
             BEGIN
              /*Your Code Goes here*/
             END

       ELSE IF(@Var1 Condition2)
              BEGIN
                /*Your Code Goes here*/ 
              END 
       ELSE IF(@Var1 Condition2)
              BEGIN
                /*Your Code Goes here*/ 
              END 
       ELSE IF(@Var1 Condition2)
              BEGIN
                /*Your Code Goes here*/ 
              END 
       ELSE      --<--- Default Task if none of the above is true
             BEGIN
               /*Your Code Goes here*/
             END
End

If your insert statements are the same, then you can use the following code snippet: 如果您的插入语句相同,则可以使用以下代码段:

DECLARE @Ugedagnr VARCHAR(10) = '1',
    @ModulID VARCHAR(10),
    @ModulID2 VARCHAR(10);

IF @Ugedagnr = '1'
BEGIN
    IF @Ugedagnr = '1'
    BEGIN
        SET @ModulID = 'S1';
        SET @ModulID2 = 'S2';
    END;

    IF @Ugedagnr = '2'
    BEGIN
        SET @ModulID = 'S5';
        SET @ModulID2 = 'S6';
    END;

    IF @Ugedagnr = '3'
    BEGIN
        SET @ModulID = 'S9';
        SET @ModulID2 = 'S10';
    END;
    IF @Ugedagnr = '4'
    BEGIN
        SET @ModulID = 'S13';
        SET @ModulID2 = 'S14';
    END;
    IF @Ugedagnr = '5'
    BEGIN
        SET @ModulID = 'S17';
        SET @ModulID2 = 'S18';
    END;

    SELECT @ModulID, @ModulID2


    BEGIN TRANSACTION
                    @ModulID = 'S9'
                    @ModulID2 = 'S10'
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber)
                    INSERT INTO Undervisning (ModulID, SkemaDato, LokaleID, HoldID, FagID, LaererID, Aar, Uge)
                    VALUES (@ModulID2, GETDATE(), @lokaleID, @holdID, @fagID, @laererID, @CurrentYear, @WeekNumber) 
    COMMIT TRANSACTION
END;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM