Как заставить SQL Server Management Studio остановить обработку при ошибке? - PullRequest
27 голосов
/ 11 мая 2009

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

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

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

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

Ответы [ 8 ]

10 голосов
/ 11 мая 2009

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

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

6 голосов
/ 11 мая 2009

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
5 голосов
/ 17 августа 2010

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

4 голосов
/ 20 августа 2009

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

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

4 голосов
/ 11 мая 2009

Вам необходимо заключить свои операторы SQL в транзакцию .

BEGIN TRANSACTION
   /* run all your SQL statements */
COMMIT TRANSACTION

Если в начале / конце транзакции произошла ошибка, все операторы будут откатаны.

РЕДАКТИРОВАТЬ: Обертывание внутри внутри начала / конца транзакции будет препятствовать фиксации операторов в базе данных, но не остановит его в этот момент. Вам необходимо дополнительно обернуть его внутри блока try / catch следующим образом:

BEGIN TRY
  BEGIN TRANSACTION
  /* run all your SQL statements */
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION
END CATCH
2 голосов
/ 11 мая 2009

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

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

0 голосов
/ 06 апреля 2011

Здесь упоминается еще несколько обходных путей:

SQL Server - остановить или прервать выполнение сценария SQL

и

SQL Server: как прервать серию пакетов в Query Analyzer?

(повышение 20 с журналом, включить noexec, режим sqlcmd: при выходе из ошибки и т. Д.)

0 голосов
/ 11 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...