Ответ 1
DECLARE @val NVARCHAR(50) = NULL
IF @val is null
RAISERROR('Custom text', 16,16)
для разных уровней проверить
Я добавляю некоторую проверку на пару хранимых процедур и должен проверить, не являются ли некоторые из переменных не нулевыми (они заселены ранее в хранимой процедуре).
Я пытаюсь добавить "throw" внутри оператора if, как показано ниже:
IF (@val is null)
BEGIN
THROW 50001, 'Custom text', 1
END
Это приводит к синтаксической ошибке в "throw", поскольку она ищет другой код внутри оператора if перед броском, но мне нужно только выполнить его в выражении if.
Мне нужно сохранить хранимую процедуру как можно более легкой, чтобы она была как можно быстрее выполнена.
Есть ли у кого-нибудь идеи?
DECLARE @val NVARCHAR(50) = NULL
IF @val is null
RAISERROR('Custom text', 16,16)
для разных уровней проверить
Синтаксическая ошибка появляется, потому что предыдущий оператор не был прерван. Другие ответы будут работать, но для того, чтобы сделать это таким образом, вы можете либо бросить точку с запятой прямо перед 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 в будущем потребует точки с запятой после каждого утверждения, поэтому моя рекомендация заключалась бы в том, чтобы начать создавать привычку.
Если это для SQL Server, то ярлык синтаксиса intellisense не нравится, но код должен компилироваться и работать нормально. Конечно, если это один оператор, вам не нужен блок BEGIN
... END
:
IF (@val is null) THROW 50001, 'Custom text', 1