SQL только бросок внутри оператора if

Я добавляю некоторую проверку на пару хранимых процедур и должен проверить, не являются ли некоторые из переменных не нулевыми (они заселены ранее в хранимой процедуре).

Я пытаюсь добавить "throw" внутри оператора if, как показано ниже:

IF (@val is null)
BEGIN
    THROW 50001, 'Custom text', 1
END

Это приводит к синтаксической ошибке в "throw", поскольку она ищет другой код внутри оператора if перед броском, но мне нужно только выполнить его в выражении if.

Мне нужно сохранить хранимую процедуру как можно более легкой, чтобы она была как можно быстрее выполнена.

Есть ли у кого-нибудь идеи?

Ответ 2

Синтаксическая ошибка появляется, потому что предыдущий оператор не был прерван. Другие ответы будут работать, но для того, чтобы сделать это таким образом, вы можете либо бросить точку с запятой прямо перед THROW, либо привыкнуть прекращать все утверждения с точкой с запятой.

IF (@val is null)
BEGIN
    ;THROW 50001, 'Custom text', 1
END

или

IF (@val is null)
BEGIN;
    THROW 50001, 'Custom text', 1;
END;

Возможно, вы заметили, что:

IF (@val is null)
    THROW 50001, 'Custom text', 1

... также будет работать, и это связано с тем, что SQL Server знает, что следующая вещь после IF-оператора всегда является новым выражением T-SQL.

Возможно, стоит отметить, что Microsoft заявила, что язык T-SQL в будущем потребует точки с запятой после каждого утверждения, поэтому моя рекомендация заключалась бы в том, чтобы начать создавать привычку.

Ответ 3

Если это для SQL Server, то ярлык синтаксиса intellisense не нравится, но код должен компилироваться и работать нормально. Конечно, если это один оператор, вам не нужен блок BEGIN... END:

IF (@val is null) THROW 50001, 'Custom text', 1