Ответ 1
Короткий ответ: вы не можете.
Благодаря тем, которые предоставили обходные пути, но похоже, что SSMS сама не может быть настроена на приостановку или остановку на ошибке так же, как Toad для SQL Server.
Это похоже на невероятно тупой вопрос, который нужно задать, но как мне заставить SQL Server Management Studio прекратить обработку SQL script при возникновении ошибки?
У меня длинный script, и если на старте SSMS появляется ошибка, а затем слепо продолжается, еще больше прикручивают вещи. Я не могу использовать транзакции, потому что script создает несколько баз данных, и они не могут совершать транзакции. Иногда создается база данных.
Toad для SQL Server будет останавливаться при первой ошибке, с которой он сталкивается, и спросить, хотите ли вы остановить или продолжить. Это поведение, которое я ищу. Он существует в SSMS?
Я не спрашиваю: "Как мне написать или изменить script, чтобы он остановился на ошибке?" Я не заинтересован в модификации моего script, чтобы это произошло, я просто хочу, чтобы SSMS остановилась на ошибке. Жаба для SQL Server выполняет именно это, и это то, что я хочу. Это также не дубликат 659188, поскольку это относится к модификации script для остановки SSMS.
Короткий ответ: вы не можете.
Благодаря тем, которые предоставили обходные пути, но похоже, что SSMS сама не может быть настроена на приостановку или остановку на ошибке так же, как Toad для SQL Server.
ApexSQL Script создает пакетные скрипты точно так, как вы хотите. В качестве примера:
--Script Header
begin transaction
go
{Statement #1}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
if @@trancount > 0 rollback transaction
set noexec on
end
go
{Statement #2}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
if @@trancount > 0 rollback transaction
set noexec on
end
go
--Script Footer
if @@trancount > 0 commit transaction
go
set noexec off
go
рассмотрите возможность использования программы командной строки 'sqlcmd', которая поставляется с SQL Server, с параметрами -b и -V. -b приведет к тому, что sqlcmd завершит работу при ошибке. -V контролирует уровень серьезности, который считается ошибкой.
Вам нужно обернуть ваши SQL-выражения в Транзакция.
BEGIN TRANSACTION
/* run all your SQL statements */
COMMIT TRANSACTION
Если в транзакции begin/end произошла ошибка, все инструкции будут отброшены назад.
РЕДАКТИРОВАТЬ: Обертка внутри транзакции "начало/конец" предотвратит фиксацию операторов в базе данных, но не остановит их в этой точке. Вам необходимо дополнительно обернуть его внутри блока try/catch следующим образом:
BEGIN TRY
BEGIN TRANSACTION
/* run all your SQL statements */
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
Ого. Это своего рода мусор? Я использую SQL-Workbench, который, подобно Toad для SQL Server, легко справляется с этим. В отличие от Toad для SQL Server, он бесплатный.
Я удивлен, что такая фундаментальная функциональность не является частью стандартного инструмента.
будет использовать здесь функцию catch catch catch. По ошибке попытка будет завершена, внедрить обработку ошибок в catch
Если вы не можете поместить свой script в хранимую процедуру и использовать оператор return для выхода с ошибкой, решение, предоставленное @Justice, может быть вашим лучшим выбором. Всем остальным не хватает точки - вы не можете вернуться из script, даже если вы используете транзакции или даже если вы raiserror. SSMS просто выполнит следующую вещь в любом случае, даже если установленное прерывание xact включено.
Если вы можете преобразовать ваш script в хранимую процедуру, то вы можете просто вернуться от него при обнаружении ошибки.
Здесь есть еще несколько проблем:
SQL Server - остановить или прервать выполнение SQL script
и
SQL Server: как прервать серию пакетов в Query Analyzer?
(raiseerror 20 с журналом, установите noexec on, режим sqlcmd: при выходе с ошибкой и т.д.)