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
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...
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.
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