Я работаю над сценарием SQL, и у меня есть требование прекратить продолжение сценария, если некоторые условия не выполняются.
Когда я нашел его в Google, я обнаружил, что RaisError с уровнем серьезности 20 прекратит его. Но по некоторым причинам я не могу использовать эту опцию.
Можете ли вы предоставить мне, каковы возможные альтернативы, чтобы остановить выполнение сценария SQL.
sql-server
sql-server-2005
error-handling
Новый разработчик
источник
источник
Ответы:
Из документации RAISERROR (выделено мое):
Весьма вероятно, что основной пользователь, которого вы выполняете сценарий, не соответствует этим критериям.
Там нет ничего плохого в использовании
RAISERROR
; вы просто используете уровень серьезности, который является чрезмерным. Я использую уровень 16 по умолчанию для ошибки, которая возникает, и последовательность будет прервана. Если вы хотите быть более точным, вы можете следовать уровням, данным самой Microsoft:Теперь, сказав все это, в зависимости от контекста сценария, используя
RAISERROR
может быть недостаточным, так как он не «сам по себе» выходит из сценария (используя нормальные уровни серьезности).Например:
Это и вызовет ошибку и возвращает набор результатов.
Для немедленного завершения сценария я предпочитаю использовать
RETURN
(использованиеGOTO
конструкций -type обычно не рекомендуется в большинстве кругов программирования, где существуют альтернативы):Или обработайте ошибку, используя
TRY/CATCH
, что вызовет переход кCATCH
блоку, если уровень серьезности равен 11 или выше:Отдельная проблема заключается в том, что если сценарий охватывает несколько пакетов, он
RETURN
будет выходить только из пакета :Чтобы это исправить, вы можете проверить
@@ERROR
в начале каждой партии:Изменить: как правильно указывает Мартин Смит в комментариях, это работает только для 2 партий. Чтобы расширить до 3 или более пакетов, вы можете каскадно создавать ошибки, например, так (примечание:
GOTO
метод не решает эту проблему, так как метка назначения должна быть определена в пакете):Или, как он также указывает, вы можете использовать
SQLCMD
метод, если он подходит для вашей среды.источник
Вы можете использовать это
GOTO
утверждение, чтобы пропустить, где вы хотите. Другими словами, вы сталкиваетесь с ошибкой или каким-либо другим условием, и у вас может быть метка внизу скрипта (т.е.TheEndOfTheScript:
) и просто выдаетсяgoto TheEndOfTheScript;
оператор.Вот быстрый пример:
Результат этого выполнения будет следующим:
Как видите, команда
GOTO
пропустила печать третьего и четвертого операторов и переместилась прямо к метке (TheEndOfTheScript
).источник
Лучше всего использовать SET NOEXEC ON
Вы можете прочитать больше здесь: Как остановить, прервать или прервать выполнение операторов в текущем пакете и в последующих пакетах, разделенных оператором GO на основании некоторого условия в SQL SERVER
источник
Согласитесь с тем
SET NOEXEC ON/OFF
, однако в Stored Procs (содержащем один блок) я просто используюRETURN
оператор.Предостережения: если в файле скрипта есть несколько
GO
операторов, ониRETURN
будут выходить только из текущего блока и переходить к следующему блоку / пакету.Примечание:
GOTO
предполагается, что это плохая практика кодирования, рекомендуется использовать "TRY..CATCH
", так как он был введен с SQL Server 2008, а затемTHROW
в 2012 году.источник