RAISERROR метод
raiserror('Oh no a fatal error', 20, -1) with log
Это прервет соединение, тем самым остановив выполнение остальной части скрипта.
Обратите внимание, что WITH LOG
для его работы необходимы как уровень серьезности 20 или выше, так и опция.
Это даже работает с операторами GO, например.
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'
Даст вам вывод:
hi
Msg 2745, Level 16, State 2, Line 1
Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 1
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Обратите внимание, что «хо» не печатается.
ПРЕДОСТЕРЕЖЕНИЯ:
- Это работает только в том случае, если вы вошли в систему как администратор (роль 'sysadmin'), а также оставляет вас без подключения к базе данных.
- Если вы НЕ вошли в систему как администратор, сам вызов RAISEERROR () завершится ошибкой, и скрипт продолжит выполнение .
- При вызове с sqlcmd.exe будет сообщен код выхода 2745.
Ссылка: http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334
Метод noexec
Еще один метод, который работает с GO-операторами set noexec on
. Это приводит к пропуску остальной части скрипта. Это не прерывает соединение, но вам нужно noexec
снова отключить, прежде чем какие-либо команды будут выполнены.
Пример:
print 'hi'
go
print 'Fatal error, script will not continue!'
set noexec on
print 'ho'
go
-- last line of the script
set noexec off -- Turn execution back on; only needed in SSMS, so as to be able
-- to run this script again in the same session.
Просто используйте RETURN (он будет работать как внутри, так и снаружи хранимой процедуры).
источник
Если вы можете использовать режим SQLCMD, то заклинание
(ВКЛЮЧАЯ двоеточие) заставит RAISERROR фактически остановить скрипт. Например,
будет выводить:
и партия остановится. Если режим SQLCMD не включен, вы получите ошибку разбора двоеточия. К сожалению, он не является полностью пуленепробиваемым, так как если сценарий запускается, не находясь в режиме SQLCMD, SQL Managment Studio легко справляется даже с ошибками разбора времени! Тем не менее, если вы запускаете их из командной строки, это нормально.
источник
Я бы не стал использовать RAISERROR - SQL имеет операторы IF, которые можно использовать для этой цели. Проведите валидацию, выполните поиск и установите локальные переменные, затем используйте значение переменных в операторах IF, чтобы сделать вставки условными.
Вам не нужно проверять переменные результаты каждого проверочного теста. Обычно это можно сделать только с одной переменной флага, чтобы подтвердить все пройденные условия:
Даже если ваша проверка более сложна, вам нужно всего лишь несколько переменных-флагов, чтобы включить ее в ваши последние проверки.
источник
RAISERROR
, особенно если вы не знаете, кто будет запускать сценарии и с какими привилегиями.declare @i int = 0; if @i=0 begin select '1st stmt in IF block' go end else begin select 'ELSE here' end go
В SQL 2012+ вы можете использовать THROW .
Из MSDN:
источник
Я успешно расширил решение по включению / выключению noexec с помощью транзакции, чтобы запустить скрипт полностью или ничего.
Видимо, компилятор «понимает» переменную @finished в IF, даже если произошла ошибка и выполнение было отключено. Тем не менее, значение устанавливается в 1, только если выполнение не было отключено. Следовательно, я могу соответственно зафиксировать или откатить транзакцию.
источник
IF (XACT_STATE()) <> 1 BEGIN Set NOCOUNT OFF ;THROW 525600, 'Rolling back transaction.', 1 ROLLBACK TRANSACTION; set noexec on END;
Но выполнение никогда не прекращалось, и я закончил с тремя ошибками «Откат транзакции». Любые идеи?Вы можете обернуть свой оператор SQL в цикл WHILE и использовать BREAK, если это необходимо
источник
DECLARE @ST INT; SET @ST = 1; WHILE @ST = 1; BEGIN; SET @ST = 0; ...; END
Более многословно, но, черт возьми, это TSQL в любом случае ;-)Вы можете изменить поток выполнения, используя операторы GOTO :
источник
Дальнейшее уточнение метода Sglasses, приведенные выше строки вынуждают использовать режим SQLCMD, и либо завершает scirpt, если не использует режим SQLCMD, либо использует
:on error exit
для выхода при любой ошибкеCONTEXT_INFO , используемый для отслеживания состояния.
источник
Это хранимая процедура? Если это так, я думаю, что вы могли бы просто сделать Return, например «Return NULL»;
источник
Я бы посоветовал вам обернуть соответствующий блок кода в блок try catch. Затем вы можете использовать событие Raiserror со степенью серьезности 11, чтобы прорваться к блоку catch, если хотите. Если вы просто хотите вызвать ошибки, но продолжить выполнение в блоке try, используйте меньшую серьезность.
Есть смысл?
Ура, Джон
[Отредактировано для включения BOL Reference]
http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx
источник
Вы можете использовать RAISERROR .
источник
Ни одна из этих работ не работает с заявлениями «GO». В этом коде, независимо от того, является ли серьезность 10 или 11, вы получите окончательный оператор PRINT.
Тестовый скрипт:
Полученные результаты:
Единственный способ сделать эту работу - написать сценарий без
GO
утверждений. Иногда это легко. Иногда это довольно сложно. (Используйте что-то вродеIF @error <> 0 BEGIN ...
.)источник
Я использую
RETURN
здесь все время, работает в сценарии илиStored Procedure
Убедитесь, что вы
ROLLBACK
транзакции, если вы в одном, в противном случаеRETURN
немедленно приведет к открытой незафиксированной транзакцииисточник
Это было мое решение:
...
источник
Вы можете использовать GOTO заявление. Попробуй это. Это полное использование для вас.
источник
Спасибо за ответ!
raiserror()
работает нормально, но вы не должны забывать об этом,return
иначе скрипт продолжит работу без ошибок! (hense raiserror не является «throwerror» ;-)) и, конечно, делает откат при необходимости!raiserror()
Приятно сказать человеку, который выполняет сценарий, что что-то пошло не так.источник
Если вы просто выполняете сценарий в Management Studio и хотите остановить выполнение или транзакцию отката (если она используется) при первой ошибке, то я считаю, что лучший способ - использовать блок try catch (начиная с SQL 2005). Это хорошо работает в Management studio, если вы выполняете файл сценария. Хранимая процедура всегда может использовать это.
источник
Раньше мы использовали следующее ... работали лучше всего:
источник
Заключите его в блок try catch, тогда выполнение будет передано в catch.
источник