Подтвердить что ты не робот

Как заставить SQL Server Management Studio прекратить обработку ошибки?

Это похоже на невероятно тупой вопрос, который нужно задать, но как мне заставить SQL Server Management Studio прекратить обработку SQL script при возникновении ошибки?

У меня длинный script, и если на старте SSMS появляется ошибка, а затем слепо продолжается, еще больше прикручивают вещи. Я не могу использовать транзакции, потому что script создает несколько баз данных, и они не могут совершать транзакции. Иногда создается база данных.

Toad для SQL Server будет останавливаться при первой ошибке, с которой он сталкивается, и спросить, хотите ли вы остановить или продолжить. Это поведение, которое я ищу. Он существует в SSMS?

Я не спрашиваю: "Как мне написать или изменить script, чтобы он остановился на ошибке?" Я не заинтересован в модификации моего script, чтобы это произошло, я просто хочу, чтобы SSMS остановилась на ошибке. Жаба для SQL Server выполняет именно это, и это то, что я хочу. Это также не дубликат 659188, поскольку это относится к модификации script для остановки SSMS.

4b9b3361

Ответ 1

Короткий ответ: вы не можете.

Благодаря тем, которые предоставили обходные пути, но похоже, что SSMS сама не может быть настроена на приостановку или остановку на ошибке так же, как Toad для SQL Server.

Ответ 2

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

Ответ 3

рассмотрите возможность использования программы командной строки 'sqlcmd', которая поставляется с SQL Server, с параметрами -b и -V. -b приведет к тому, что sqlcmd завершит работу при ошибке. -V контролирует уровень серьезности, который считается ошибкой.

Ответ 4

Вам нужно обернуть ваши 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

Ответ 5

Ого. Это своего рода мусор? Я использую SQL-Workbench, который, подобно Toad для SQL Server, легко справляется с этим. В отличие от Toad для SQL Server, он бесплатный.

Я удивлен, что такая фундаментальная функциональность не является частью стандартного инструмента.

Ответ 6

будет использовать здесь функцию catch catch catch. По ошибке попытка будет завершена, внедрить обработку ошибок в catch

http://msdn.microsoft.com/en-us/library/ms179296.aspx

Ответ 7

Если вы не можете поместить свой script в хранимую процедуру и использовать оператор return для выхода с ошибкой, решение, предоставленное @Justice, может быть вашим лучшим выбором. Всем остальным не хватает точки - вы не можете вернуться из script, даже если вы используете транзакции или даже если вы raiserror. SSMS просто выполнит следующую вещь в любом случае, даже если установленное прерывание xact включено.

Если вы можете преобразовать ваш script в хранимую процедуру, то вы можете просто вернуться от него при обнаружении ошибки.