Подтвердить что ты не робот

Несколько отдельных условий IF в SQL Server

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

ELSE IF(SOMETHNGZ)
 BEGIN
  IF(SOMETHINGY)
   BEGIN..END
  ELSE IF (SOMETHINGY)
   BEGIN..END
  ELSE
   BEGIN..END
  --The above works I then insert this below and these if statement become nested----
  IF(@A!= @SA)

  IF(@S!= @SS)

  IF(@C!= @SC) 

  IF(@W!= @SW)
  --Inserted if statement stop here
 END
ELSE <-- final else    

Таким образом, это будет рассматриваться как

IF(@A!= @SA){           
        IF(@S!= @SS){           
            IF(@C!= @SC) {      
                IF(@W!= @SW){}
            }
        }
    }

Что я ожидаю, это

IF(@A!= @SA){}          
IF(@S!= @SS){}      
IF(@C!= @SC){}
IF(@W!= @SW){}

Я тоже пробовал это, и он бросает Incorrect syntax near "ELSE". Expecting "CONVERSATION"

IF(@A!= @SA)
BEGIN..END                  
IF(@S!= @SS)
BEGIN..END      
IF(@C!= @SC) 
BEGIN..END  
IF(@W!= @SW)
   BEGIN..END

Обратите внимание, что из ELSE <--final else down теперь вложен внутри IF(@W!= @SW). Несмотря на то, что он является частью внешнего оператора if ELSE IF(SOMETHNGZ) раньше.

EDIT

В соответствии с запросом мой полный оператор

ALTER Procedure [dbo].[SP_PLaces]  
@ID int, 
..more params
AS
BEGIN
SET NOCOUNT ON
DECLARE @SomeId INT
..more varaible
SET @SomeId = user define function()
..more SETS
IF(@ID IS NULL)
BEGIN
BEGIN TRY
    INSERT INTO Places              
    VAlUES(..Values...)            
    ... more stuff...               
    BEGIN TRY       
        exec Store procedure 
            @FIELD = 15, ... more params...             
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE() AS 'Message' 
        RETURN -1
    END CATCH                      
    RETURN 0                
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS 'Message' 
    RETURN -1
END CATCH   
END 
ELSE IF(@ID IS NOT NULL AND @ID in (SELECT ID FROM Places)) 
BEGIN   
     SELECT @MyName = Name ...  
    ...Some stuff....                       
    IF(SOMETHNG_1)          
        BEGIN TRY               
            UPDATE ....                                                                 
        END TRY
        BEGIN CATCH
            SELECT ERROR_MESSAGE() AS 'Message' 
            RETURN -1
        END CATCH
    ELSE IF(SOMETHNG_2)
        BEGIN TRY
            UPDATE ...                                                      
        END TRY
        BEGIN CATCH
            SELECT ERROR_MESSAGE() AS 'Message' 
            RETURN -1
        END CATCH   
    ELSE  
        BEGIN
            BEGIN TRY
                UPDATE ...                                                              
            END TRY
            BEGIN CATCH
                SELECT ERROR_MESSAGE() AS 'Message' 
                RETURN -1
            END CATCH   
        END             
      --The above works I then insert this below and these if statement become nested----
  IF(@A!= @SA)
    BEGIN
     exec Stored procedure 
            @FIELD = 15,
            ... more params...
    END                 
IF(@S!= @SS)
  BEGIN
     exec Stored procedure 
            @FIELD = 10,
            ... more params...
    END     
IF(@C!= @SC) 
  BEGIN
     exec Stored procedure 
            @FIELD = 17,
            ... more params...
    END 
IF(@W!= @SW)
    BEGIN
     exec Stored procedure 
            @FIELD = 12,
            ... more params...
    END
  --Inserted if statement stop here             
END     
ELSE    
    BEGIN
        SET @ResultMessage = 'Update/Delete Failed. No record found with   ID:'+CONVERT(varchar(50), @ID) 
        SELECT @ResultMessage AS 'Message' 
        RETURN -1
    END
Set NOCOUNT OFF
END
4b9b3361

Ответ 1

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

IF(@Var1 Condition1)
     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

Если вы проверяете условия в отношении нескольких переменных, вам придется перейти на несколько IF Заявления. Каждый блок кода будет выполняться независимо от других блоков.

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


IF(@Var2 Condition1)
 BEGIN
   /*Your Code Goes here*/
 END


IF(@Var3 Condition1)
 BEGIN
   /*Your Code Goes here*/
 END

После каждого оператора IF, если выполняется более одного оператора, вы ДОЛЖНЫ вставить их в  BEGIN..END Block. Во всяком случае, всегда лучше использовать блоки BEGIN..END.

Обновление

Найденное в вашем коде какое-то BEGIN END, которое вам не хватает

ELSE IF(@ID IS NOT NULL AND @ID in (SELECT ID FROM Places))   -- Outer Most Block ELSE IF
BEGIN   
     SELECT @MyName = Name ...  
    ...Some stuff....                       
    IF(SOMETHNG_1)         -- IF
                 --BEGIN
        BEGIN TRY               
            UPDATE ....                                                                 
        END TRY

        BEGIN CATCH
            SELECT ERROR_MESSAGE() AS 'Message' 
            RETURN -1
        END CATCH
                -- END
    ELSE IF(SOMETHNG_2)    -- ELSE IF
                 -- BEGIN
        BEGIN TRY
            UPDATE ...                                                      
        END TRY
        BEGIN CATCH
            SELECT ERROR_MESSAGE() AS 'Message' 
            RETURN -1
        END CATCH   
               -- END
    ELSE                  -- ELSE
        BEGIN
            BEGIN TRY
                UPDATE ...                                                              
            END TRY
            BEGIN CATCH
                SELECT ERROR_MESSAGE() AS 'Message' 
                RETURN -1
            END CATCH   
         END             
      --The above works I then insert this below and these if statement become nested----
          IF(@A!= @SA)
            BEGIN
             exec Store procedure 
                    @FIELD = 15,
                    ... more params...
            END                 
        IF(@S!= @SS)
          BEGIN
             exec Store procedure 
                    @FIELD = 10,
                    ... more params...

Ответ 2

Чтобы избежать синтаксических ошибок, обязательно поставьте BEGIN и END после предложения IF, например:

IF (@A!= @SA)
   BEGIN
   --do stuff
   END
IF (@C!= @SC)
   BEGIN
   --do stuff
   END

... и так далее. Это должно работать должным образом. Представьте себе BEGIN и END ключевое слово как открывающее и закрывающее скобки соответственно.

Ответ 3

Возможно, это немного избыточно, но никто, похоже, не упомянул об этом как о решении.

Как новичок в SQL, я обнаружил, что при использовании SSF BEGIN и END SSMS обычно добавляет squiggly line с incorrect syntax near 'END' в END, просто потому, что между ними пока нет контента. Если вы просто настраиваете BEGIN и END для начала и добавляете фактический запрос позже, просто добавьте подставку PRINT, чтобы SSMS перестала беспокоить вас.

Например:

IF (1=1)
BEGIN
  PRINT 'BOGUS'
END

Следующее действительно приведет вас к неправильному пути, считая, что вы сделали синтаксическую ошибку, которая в этом случае просто означает, что вам все равно нужно добавлять контент между BEGIN и END:

IF (1=1)
BEGIN
END