ストアドプロシージャには、互いに独立した複数のIF
ステートメントがあります。しかし、何らかの理由で、それらは1つの大きな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
_
From _ELSE <--final else
_ downは、外側のifステートメントIF(@W!= @SW)
の前にあるにもかかわらず、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
_
1つの変数を複数の条件に対してチェックする場合は、次のようなものを使用します。ここでは、条件が真であるコードブロックが実行され、他のブロックは無視されます。
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ブロックに入れる必要があります。とにかく、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...
構文エラーを回避するには、BEGIN
句の後に必ずEND
とIF
を配置するようにしてください。例:
IF (@A!= @SA)
BEGIN
--do stuff
END
IF (@C!= @SC)
BEGIN
--do stuff
END
... 等々。これは期待どおりに機能するはずです。 BEGIN
およびEND
キーワードをそれぞれ開始ブラケットと終了ブラケットとして想像してください。
多分これは少し冗長ですが、誰もこれを解決策として言及しているようには見えませんでした。
SQLの初心者として、BEGIN
とEND
を使用すると、SSMSは通常incorrect syntax near 'END'
の波線をENDに追加します。これは、間にコンテンツがないためです。 BEGIN
とEND
をセットアップして実際のクエリを後で追加するだけの場合は、偽のPRINT
ステートメントを追加するだけで、SSMSが邪魔をしなくなります。
例えば:
IF (1=1)
BEGIN
PRINT 'BOGUS'
END
以下は、実際には間違った方向にあなたを設定します。構文エラーを犯したと思います。この場合、BEGINとENDの間にコンテンツを追加する必要があります。
IF (1=1)
BEGIN
END