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 a WITH LOG
opção são necessárias para que funcione dessa maneira.
Isso funciona mesmo com instruções GO, por exemplo.
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'
Dará a você 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 funciona apenas 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 chamada RAISEERROR () falhará e o script continuará sendo executado .
- Quando chamado 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 restante do script seja pulado. Não encerra a conexão, mas você precisa ativarnoexec
desligar 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.
Basta usar um RETURN (ele funcionará dentro e fora de um procedimento armazenado).
fonte
Se você pode usar o modo SQLCMD, o encantamento
(INCLUINDO os dois pontos) fará com que RAISERROR realmente pare o script. Por exemplo,
irá produzir:
e o lote irá parar. Se o modo SQLCMD não estiver ativado, você receberá um erro de análise sobre os dois pontos. Infelizmente, não é completamente à prova de balas, como se o script fosse executado sem estar no modo SQLCMD, o SQL Managment Studio passa rapidamente até mesmo analisando erros de tempo! Ainda assim, se você estiver executando-os na linha de comando, tudo bem.
fonte
Eu não usaria instruções RAISERROR-SQL has IF que podem ser usadas para esse fim. Faça sua validação e pesquisas e defina variáveis locais e, em seguida, use o valor das variáveis nas instruções IF para tornar as inserções condicionais.
Você não precisaria verificar um resultado variável de cada teste de validação. Você geralmente pode fazer isso com apenas uma variável de sinalizador para confirmar todas as condições aprovadas:
Mesmo que sua validação seja mais complexa, você precisará apenas de algumas variáveis de sinalizador para incluir em suas verificações finais.
fonte
RAISERROR
, especialmente se você não sabe quem executará os scripts e com quais privilégios.declare @i int = 0; if @i=0 begin select '1st stmt in IF block' go end else begin select 'ELSE here' end go
No SQL 2012+, você pode usar o THROW .
Do MSDN:
fonte
Estendi com êxito a solução onexec on / off com uma transação para executar o script de uma maneira tudo ou nada.
Aparentemente, o compilador "entende" a variável @finished no IF, mesmo se houver um erro e a execução estiver desabilitada. No entanto, o valor é definido como 1 somente se a execução não foi desativada. Portanto, posso confirmar ou reverter a transação adequadamente.
fonte
IF (XACT_STATE()) <> 1 BEGIN Set NOCOUNT OFF ;THROW 525600, 'Rolling back transaction.', 1 ROLLBACK TRANSACTION; set noexec on END;
Mas a execução nunca parou e acabei com os três erros de "Reversão da transação" gerados. Alguma ideia?você pode agrupar sua instrução SQL em um loop WHILE e usar BREAK, se necessário
fonte
DECLARE @ST INT; SET @ST = 1; WHILE @ST = 1; BEGIN; SET @ST = 0; ...; END
Mais detalhado, mas que diabo, é TSQL qualquer maneira ;-)Você pode alterar o fluxo de execução usando instruções GOTO :
fonte
Refinando ainda mais o método Sglasses, as linhas acima forçam o uso do modo SQLCMD e limitam o escopo se não estiver usando o modo SQLCMD ou usam
:on error exit
para sair de qualquer erroCONTEXT_INFO é usado para acompanhar o estado.
fonte
Este é um procedimento armazenado? Nesse caso, acho que você poderia simplesmente fazer um retorno, como "Return NULL";
fonte
Sugiro que você agrupe seu bloco de código apropriado em um bloco try catch. Em seguida, você pode usar o evento Raiserror com uma gravidade de 11 para interromper o bloco catch, se desejar. Se você deseja apenas aumentar os espelhos, mas continuar a execução no bloco try, use uma gravidade mais baixa.
Faz sentido?
Cheers, John
[Editado para incluir referência BOL]
http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx
fonte
você pode usar o RAISERROR .
fonte
Nenhum desses trabalhos com instruções 'GO'. Nesse código, independentemente de a gravidade ser 10 ou 11, você obtém a instrução PRINT final.
Script de teste:
Resultados:
A única maneira de fazer isso funcionar é escrever o script sem
GO
instruções. Às vezes é fácil. Às vezes é bem difícil. (Use algo parecidoIF @error <> 0 BEGIN ...
.)fonte
Eu uso
RETURN
aqui o tempo todo, trabalha em script ouStored Procedure
Verifique se
ROLLBACK
a transação está em uma, caso contrário,RETURN
imediatamente resultará em uma transação não confirmada abertafonte
Esta foi a minha solução:
...
fonte
Você pode usar a instrução GOTO. Tente isso. Este é o uso completo para você.
fonte
Thx pela resposta!
raiserror()
funciona bem, mas você não deve esquecer areturn
declaração, caso contrário, o script continua sem erros! (observe que o raiserror não é um "throwerror" ;-)) e, é claro, fazendo uma reversão, se necessário!raiserror()
é bom dizer à pessoa que executa o script que algo deu errado.fonte
Se você está simplesmente executando um script no Management Studio e deseja interromper a execução ou a transação de reversão (se usada) no primeiro erro, a melhor maneira que eu acho é usar o bloco try try (SQL 2005 em diante). Isso funciona bem no Management studio se você estiver executando um arquivo de script. O proc armazenado sempre pode usar isso também.
fonte
No dia em que usamos o seguinte ... funcionou melhor:
fonte
Coloque-o em um bloco try catch, então a execução será transferida para catch.
fonte