Usuário com melhor resposta
BEGIN CATCH de procedure para procedure

Pergunta
-
Bom dia pessoal eu tenho uma procedure que tem um BEGN CATH ja estruturado , mas vou chamar ela dentro de outra... como faço para que essa outra .. retorne o erro da primeira ..
CREATE OR ALTER PROCEDURE [dbo].[STP_INT_EXEC_IMPORTACAO_ATIVIDADE] -- EXEC STP_INT_EXEC_IMPORTACAO_ATIVIDADE 10,1000,1000
(
@LACO INT = 10,
@QTD_OS INT =50000,
@LACO_REPROCESSA INT = 25000
)
AS
BEGIN TRY
/*****************************************************************************************************
Procedure para
#3954 - Douglas Fernandes - 22/05/2019 - SIGOS - INTERFACE - Reprocessar atividade e ajustar regras
*******************************************************************************************************/
/*
update INT_FTP_ORDEM_SERVICO set FLAG_PROCESSADO = 0, FLAG_REPROCESSA = 0 ,DESCRICAO_ERRO = null , FLAG_ERRO = 0
where ID_ORDEM_SERVICO in (SELECT TOP 5000 ID_ORDEM_SERVICO FROM INT_FTP_ORDEM_SERVICO)
*/
DECLARE @COUNT INT = 0;
DECLARE @CONT_1EM1 INT = 0;
WHILE (@COUNT < @LACO)
BEGIN
EXEC MXL01_INTERFACE..STP_INT_ATIVIDADE_COPASA @QTD_OS;
SET @COUNT = @COUNT +1;
END
WHILE ((@CONT_1EM1 < @LACO_REPROCESSA) AND (EXISTS(SELECT COUNT(1) FROM INT_FTP_ORDEM_SERVICO WITH(NOLOCK) WHERE ISNULL(FLAG_REPROCESSA,0)=1 AND ISNULL(NUM_TENTATIVAS,0) <= 2 )))
BEGIN
EXEC MXL01_INTERFACE..STP_INT_ATIVIDADE_COPASA 1;
SET @CONT_1EM1 = @CONT_1EM1 +1;
END
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
Respostas
-
Ddev13,
O que pode ser feito então, é você armazenar o erro apresentado pelas funções de captura e tratamento de erros, armazenar estes valores em uma tabela e não aplicar alguma condição na stored procedure que faz a chamada.
O que você acha?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta Ddev13 quarta-feira, 29 de maio de 2019 16:16
Todas as Respostas
-
Ddev13,
Vamos lá, inicialmente adicione o bloco Begin...End no corpo da sua Stored Procedure para delimitarmos a estrutura de Código.
Você já declarou esta Stored Procedure dentro do Bloco Begin Try...Catch, por padrão ao ocorrer um erro o SQL Server vai obter o retorno do erro e apresentar no Catch.
Veja o meu exemplo abaixo:
-- Criando a Stored Procedure P_HelloWorld -- Create Procedure P_HelloWorld @NomeUsuario Varchar(20) As Set NoCount On Begin Select 'Hello World...'+@NomeUsuario End -- Criando a Stored Procedure P_Calcular -- Create Procedure P_Calculadora @Valor1 Int = Null, @Valor2 Int = Null, @Operador Char(1) As Begin If (@Valor1 Is Not Null And @Valor2 Is Not Null) Begin -- Bloco Begin Try -- Begin Try Declare @Resultado Int=0 If @Operador = '+' Set @Resultado = (@Valor1 + @Valor2) Else If @Operador = '-' Set @Resultado = (@Valor1 - @Valor2) Else If @Operador = '*' Set @Resultado = (@Valor1 * @Valor2) Else If @Operador = '/' Set @Resultado = (@Valor1 / @Valor2) Else Select 'Operador inválido' Execute P_HelloWorld Select 'O Resultado da Operação de'+ Case @Operador When '+' Then Concat(' Adição é: ',@Resultado) When '-' Then Concat(' Subtração é: ',@Resultado) When '*' Then Concat(' Multiplicação é: ',@Resultado) When '/' Then Concat(' Divisão é:',@Resultado) End As Operacao End Try -- Encerrando o Begin Try -- -- Bloco Begin Catch -- Begin Catch SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_MESSAGE() AS ErrorMessage, ERROR_LINE() AS ErrorLine; End Catch -- Encerrando o Begin Catch -- End Else Select 'Informe os Valores para realizar a Operação' As 'Mensagem de Alerta' End -- Executando a Stored Procedure P_Calcular -- Execute P_Calculadora 10,2,'/' Go
Note que existem duas Stored Procedures: P_HelloWord e P_Calculadora, dentro da P_Calculadora estou chamando a P_HelloWord sem passar o valor no parâmetro de entrada, por padrão as funções de captura e tratamento de erro serão envolvidas e disparadas.Deixe que todo tratamento de erro seja feito inicialmente na Stored Procedure principal.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
-
-
Ddev13,
Mas o controle para tratamento de erros ficaria em qual stored procedure?
Se eu entendi bem seria na procedure que estaria sendo chamada e não na quem chama. É isso?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Ddev13,
O que pode ser feito então, é você armazenar o erro apresentado pelas funções de captura e tratamento de erros, armazenar estes valores em uma tabela e não aplicar alguma condição na stored procedure que faz a chamada.
O que você acha?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta Ddev13 quarta-feira, 29 de maio de 2019 16:16
-
-