Вложение if-операторов внутри хранимой процедуры - PullRequest
0 голосов
/ 25 февраля 2019

Я создаю хранимую процедуру, которая должна проверять несколько условий и в зависимости от результата должна выполнять конкретные запросы.У меня проблемы, когда дело доходит до вложенных IF-операторов, и я действительно не могу понять, что не так с синтаксисом.

Вот фрагмент моего кода (остальное в значительной степени то же самое, нос другими значениями)

 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

Он продолжает жаловаться на второй оператор IF после первого (IF @Ugedagnr = '1').

Как записываются вложенные операторы IF?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Поскольку вы проверяете одну переменную на наличие нескольких условий, вам следует использовать что-то вроде этого. Здесь будет выполнен блок кода, в котором выполняется условие true, а другие блоки будут проигнорированы.

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
0 голосов
/ 25 февраля 2019

Если ваши операторы вставки совпадают, вы можете использовать следующий фрагмент кода:

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;
0 голосов
/ 25 февраля 2019
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

Обратите внимание, синтаксис @ModulID = 'S1' недопустим.Использование SET @ModulID = 'S1'.

Отображение между @Ugedagnr и @Modul* может быть легко реализовано через таблицу карт и одиночный выбор вместо набора IF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...