it-swarm.com.de

Mehrere separate IF-Bedingungen in SQL Server

Ich habe mehrere IF-Anweisungen, die in meiner gespeicherten Prozedur voneinander unabhängig sind. Aber aus irgendeinem Grund werden sie ineinander geschachtelt, als wären sie Teil einer großen if-Anweisung

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    

Also wird es so behandelt

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

Was ich erwarte ist das

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

Ich habe es auch ausprobiert und es wirft 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

Beachten Sie, dass ab ELSE <--final else abwärts in IF(@W!= @SW) geschachtelt ist, obwohl es Teil der äußeren if-Anweisung ELSE IF(SOMETHNGZ) ist.

EDIT 

Wie auf Anfrage meine vollständige Erklärung

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
16
Jack Thor

WENN Sie eine Variable mit mehreren Bedingungen vergleichen, würden Sie so etwas wie folgt verwenden.

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

Wenn Sie Bedingungen gegen mehrere Variablen prüfen, müssen Sie mehrere IF -Anweisungen verwenden. Jeder Codeblock wird unabhängig von anderen Blöcken ausgeführt. 

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

Wenn nach jeder IF-Anweisung mehr als eine Anweisung ausgeführt wird, MÜSSEN Sie sie in .__ einfügen. BEGIN..END Block. Es ist jedoch immer empfehlenswert, BEGIN..END-Blöcke zu verwenden

Update

Etwas in Ihrem Code gefundenes BEGIN END fehlt Ihnen 

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...
28
M.Ali

Um Syntaxfehler zu vermeiden, müssen Sie unbedingt BEGIN und END nach einer IF-Klausel setzen, z.

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

... und so weiter. Dies sollte wie erwartet funktionieren. Stellen Sie sich BEGIN und END als öffnende bzw. schließende Klammer vor.

2
LittleSweetSeas

Vielleicht ist das ein bisschen überflüssig, aber niemand scheint dies als Lösung erwähnt zu haben. 

Als Anfänger in SQL stelle ich fest, dass SSMS bei Verwendung einer BEGIN und END normalerweise eine squiggly-Zeile mit incorrect syntax near 'END' zu END hinzufügt. Wenn Sie lediglich BEGIN und END einrichten, um später mit der eigentlichen Abfrage beginnen zu können, fügen Sie einfach eine falsche PRINT-Anweisung hinzu.

Zum Beispiel:

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

Das Folgende wird Sie auf die falsche Spur bringen, da Sie denken, Sie hätten einen Syntaxfehler gemacht. In diesem Fall müssen Sie lediglich zwischen BEGIN und END Inhalte hinzufügen:

IF (1=1)
BEGIN
END
1
dbj