Несколько отдельных условий 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
Ответы
Ответ 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