Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server - pare ou interrompa a execução de um script SQL


O método raiserror
raiserror('Oh no a fatal error', 20, -1) with log

Isso encerrará a conexão, interrompendo a execução do restante do script.

Observe que o nível de gravidade 20 ou superior e o WITH LOG opção são necessárias para que ele funcione dessa maneira.

Isso funciona até mesmo com instruções GO, por exemplo.
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'

Vai te dar a saída:
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.

Observe que 'ho' não é impresso.

RESSALVAS:
  • Isso só funciona se você estiver logado como administrador (função 'sysadmin') e também deixa você sem conexão com o banco de dados.
  • Se você NÃO estiver logado como administrador, a própria chamada RAISEERROR() falhará e o script continuará executando .
  • Quando invocado com sqlcmd.exe, o código de saída 2745 será relatado.

Referência:http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334

O método noexec

Outro método que funciona com instruções GO é set noexec on . Isso faz com que o resto do script seja ignorado. Ele não encerra a conexão, mas você precisa ativar noexec off novamente antes que qualquer comando seja executado.

Exemplo:
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.