Estou trabalhando no script sql e estou tendo um requisito de parar de continuar o script se algumas condições não forem atendidas.
Quando o pesquiso no Google, descobri que o RaisError com 20 níveis de gravidade o encerrará. Mas, por algumas razões, não posso usar essa opção.
Pode me fornecer quais são as alternativas possíveis para interromper a execução do script SQL.
sql-server
sql-server-2005
error-handling
Novo desenvolvedor
fonte
fonte
Respostas:
Na documentação do RAISERROR (ênfase minha):
É muito provável que o diretor que você está executando o script não atenda a esses critérios.
Não há nada de errado em usar
RAISERROR
; você está apenas usando um nível de gravidade excessivo. Eu uso o nível 16 como padrão para um erro gerado e a sequência será encerrada. Se você quiser ser mais preciso, pode seguir os níveis dados pela própria Microsoft:Agora, tendo dito tudo isso, dependendo do contexto do script, o uso
RAISERROR
pode não ser suficiente, pois não "sai" do script por si só (usando níveis normais de gravidade).Por exemplo:
Isto irá tanto gerar um erro e retornar um conjunto de resultados.
Para finalizar o script imediatamente, prefiro usar
RETURN
(o uso deGOTO
construções -type geralmente é desencorajado na maioria dos círculos de programação em que existem alternativas):Ou lide com o erro usando
TRY/CATCH
, o que fará com que a execução pule para oCATCH
bloco se a gravidade for 11 ou superior:Um problema separado é se o script abranger vários lotes -
RETURN
sairá apenas do lote :Para corrigir isso, você pode verificar
@@ERROR
no início de cada lote:Editar: Como Martin Smith corretamente aponta nos comentários, isso funciona apenas para 2 lotes. Para estender para 3 ou mais lotes, é possível cascatear os erros de aumento dessa maneira (observação: o
GOTO
método não resolve esse problema, pois o rótulo de destino deve ser definido no lote):Ou, como ele também aponta, você pode usar o
SQLCMD
método se for apropriado para o seu ambiente.fonte
Você pode utilizar a
GOTO
declaração para pular para onde quiser. Em outras palavras, você encontra um erro ou alguma outra condição e pode ter um rótulo na parte inferior do script (ou sejaTheEndOfTheScript:
) e apenas emitir umagoto TheEndOfTheScript;
declaração.Aqui está uma amostra rápida:
A saída desta execução será a seguinte:
Como você pode ver, o documento
GOTO
pulou a impressão da terceira e da quarta instruções e pulou direto para a etiqueta (TheEndOfTheScript
).fonte
A melhor maneira é usar SET NOEXEC ON
Você pode ler mais aqui: Como parar ou interromper ou interromper a execução das instruções no lote atual e nos lotes subsequentes separados pela instrução GO com base em alguma condição no SQL SERVER
fonte
Concorde com o
SET NOEXEC ON/OFF
, no entanto, em Procs armazenados (contendo um único bloco), simplesmente uso aRETURN
instruçãoAdvertências: em um arquivo de script, se você tiver várias
GO
instruções, oRETURN
sairá apenas do bloco atual e continuará com o próximo bloco / lote.Nota:
GOTO
é uma prática de codificação inadequada, o uso de "TRY..CATCH
" é recomendado, pois foi introduzido desde o SQL Server 2008, seguido porTHROW
2012.fonte