web-dev-qa-db-fra.com

Plusieurs conditions IF distinctes dans SQL Server

J'ai plusieurs instructions IF qui sont indépendantes les unes des autres dans ma procédure stockée. Mais pour une raison quelconque, ils sont imbriqués les uns dans les autres, comme s'ils faisaient partie d'une déclaration big 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    

Donc ce sera traité comme ça

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

Ce que j'attend est ceci

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

J'ai aussi essayé ceci et ça jette 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

Notez que depuis ELSE <--final else down est maintenant imbriqué dans IF(@W!= @SW) Même s'il fait partie de l'instruction if extérieure ELSE IF(SOMETHNGZ) auparavant.

MODIFIER 

Selon la demande, ma déclaration complète

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

SI vous comparez une variable par rapport à plusieurs conditions, vous utiliserez quelque chose comme ceci.

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

Si vous vérifiez les conditions par rapport à plusieurs variables, vous devrez alors utiliser plusieurs instructions IF Chaque bloc de code sera exécuté indépendamment des autres blocs. 

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

Après chaque instruction IF, s'il y a plusieurs instructions en cours d'exécution, vous DEVEZ les insérer BEGIN..END Block. Quoi qu’il en soit, il est toujours recommandé d’utiliser les blocs BEGIN..END.

Mettre à jour

Vous avez trouvé quelque chose dans votre code qui manque de 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...
28
M.Ali

Pour éviter les erreurs de syntaxe, veillez à toujours mettre BEGIN et END après une clause IF, par exemple:

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

... etc. Cela devrait fonctionner comme prévu. Imaginez les mots clés BEGIN et END en tant qu'accolade ouvrante et fermante, respectivement.

2
LittleSweetSeas

C'est peut-être un peu redondant, mais personne ne semble l'avoir mentionné comme solution. 

En tant que débutant en SQL, je constate qu'en utilisant BEGIN et END, SSMS ajoute généralement une ligne irrégulière avec incorrect syntax near 'END' à END, simplement parce qu'il n'y a pas encore de contenu entre les deux. Si vous configurez simplement BEGIN et END pour commencer et ajouter la requête réelle plus tard, ajoutez simplement une fausse instruction PRINT afin que SSMS cesse de vous déranger.

Par exemple:

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

Ce qui suit vous mettra en effet sur la mauvaise piste, en pensant que vous avez commis une erreur de syntaxe qui signifie simplement que vous devez toujours ajouter du contenu entre BEGIN et END:

IF (1=1)
BEGIN
END
1
dbj