Ir para conteúdo
Fórum Script Brasil
  • 0

Tratamento de erro


rodrigotnoma

Pergunta

Boa noite,

Estou tentando fazer uma procedure, dentro dessa procedure serão executadas outras procedures e alguns inserts e updates.

Gostaria de executa-la por bloco, e a se o bloco a ser executado der algum erro, paro a execução e exibo uma mensagem do step que deu problema.

Criei essa como teste:

alter procedure Sp_TesteErro
-- Sp_TesteErro 'Rodrigo'
(
@nome varchar(100)
)
as
begin

begin transaction

declare @error    int
declare @msg    varchar(1000)

insert into tabela1 values('Rodrigo')

Set @error = @@error

if @error<>0
begin
set @msg = 'Erro passo 1'
goto errodetail
end

insert into tabela1 values('Romina')

Set @error = @@error

if @error<>0
begin
set @msg = 'Erro passo 2'
goto errodetail
end

errodetail:
if @error <> 0
begin
rollback transaction
select @msg
end
else
commit transaction

end

Quando executo, a segunda vez, a procedure exibe erro de PK, mostra a mensagem de "Erro no passo 1", mas também exibe o erro:

Server: Msg 2627, Level 14, State 1, Procedure Sp_TesteErro, Line 14

Violation of PRIMARY KEY constraint 'PK__tabela1__0DAF0CB0'. Cannot insert duplicate key in object 'tabela1'.

The statement has been terminated.

Como faço para que não seja exibida essa mensagem e sim somente a minha mensagem de "Erro no passo 1"?

Obrigado.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Rodrigo,

Tem como você suprimir a mensagem de erro do sql. Mas tenho uma dica melhor... rs.

A variável @@error do sql é setada sempre quando ocorre uma transação. Sendo assim, em toda transação do script você terá q colocar uma verificação de tratamento de erro (igual você fez).

Particularmente não gosto desta implementação, uma vez que "polui" o script com verificações corriqueiras de erro.

Tem outra forma interessante de tratar erros, com o Try / Catch. É uma implementação mais simples e limpa.

Vou colocar um exemplo com seu script. Perceba que alterei o SET de mensagem de erro. Antes de fazer a execução do script, você seta a variável. Dê uma olhada:

alter procedure Sp_TesteErro
-- Sp_TesteErro 'Rodrigo'
(
@nome varchar(100)
)
as

declare @error int
declare @msg varchar(1000)

BEGIN TRY
BEGIN TRAN

set @msg = 'Erro passo 1'
insert into tabela1 values('Rodrigo')

set @msg = 'Erro passo 2'
insert into tabela1 values('Romina')

COMMIT TRAN
END TRY 

BEGIN CATCH
SELECT @msg
rollback transaction
END CATCH

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Rodrigo,

Desculpe, mas esqueci de perguntar qual a versão do sql.

Para suprimir a mensagem de erro:

SET ANSI_WARNINGS OFF
SET ARITHABORT OFF
SET ARITHIGNORE OFF

OBS.: o interessante seria não desativar a mensagem. Ela é uma forma importante de tratamento e identificação de erros do sql.

O comando é válido apenas para a sessão. Uma coisa interessante é que você utilizará estes comandos dentro de uma SP (stored procedure). Este comando faz com que a SP recompile.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...