0

Transact SQL - Por que Utilizar o Try..Catch?

#SQL Server
Gabriel Anna
Gabriel Anna

A estrutura de Try Catch da linguagem Transact SQL possui o mesmo objetivo das estruturas de tratamento de exceções presentes em linguagens de programação como Java, C# e C++, ou seja, possibilitar que o código envolvido consiga continuar o seu processamento mesmo diante de determinados erros de execução.

 Aplicação:

Para testar esse conceito no SQL Server será utilizado o seguinte contexto de programação:

  • Tabelas - (tPessoa e tmp_pessoa_data_erro) 

       CREATE TABLE dbo.tPessoa(Id INT IDENTITY(1,1),Nome NVARCHAR(100), DataNascimento NVARCHAR(10) )

 CREATE TABLE dbo.tmp_pessoa_data_erro( Id INT,DataNascimento NVARCHAR(10) )

A tabela dbo.tPessoa deverá armazenar os registros das pessoas. Nela será realizada a consulta que gerará um erro de execução (Uma exceção). Na tabela tmp_pessoa_data_erro serão armazenados os registros que provocaram os erros capturados pelo Try Catch.

  • Carga de Registros:

INSERT INTO dbo.tPessoa (Nome,DataNascimento) VALUES ('Roberto Teste','19880507')

INSERT INTO dbo.tPessoa (Nome,DataNascimento) VALUES ('Maria Teste','19880507')

INSERT INTO dbo.tPessoa (Nome,DataNascimento) VALUES ('João Teste','19880507')

INSERT INTO dbo.tPessoa (Nome,DataNascimento) VALUES ('Patrícia Teste','198807')

INSERT INTO dbo.tPessoa (Nome,DataNascimento) VALUES ('Joana Teste','19880528')

INSERT INTO dbo.tPessoa (Nome,DataNascimento) VALUES ('Júlia Teste','19883107')


A tabela tPessoa possui os atributos Id (Identity), Nome e DataNascimento. O atributo DataNascimento é do tipo nvarchar(10) e os registros deveriam estar com a seguinte formatação YYYYMMDD (anomêsdia - 19840529). Onde os quatro primeiros digitos são o ano, os dois digitos seguintes são os meses e os últimos dois digitos são os dias. Neste caso , a data apresentada como exemplo é correspondente a 29/05/1984.

Com o objetivo de uniformizar todos os valores do atributo DataNascimento para o tipo Date no formato 1984-05-31 será executada a consulta abaixo:

select ID, Nome, CONVERT(DATE, DataNascimento,120) as DataNascimento from tPessoa.

No momento que a consulta for executada a exceção abaixo será apresentada e nenhuma data de registro formatada será apresentada. 

Mensagem 241, Nível 16, Estado 1, Linha 11

Falha ao converter data e/ou hora da cadeia de caracteres.

 O problema é que a função CONVERT não consegue identificar uma data no formato   YYYDDMM por exemplo. Neste caso, seria interessante armazenar as datas com  formatos incompatíveis em uma tabela temporária para depois serem tratadas. Como isso pode ser feito? Uma possibilidade de tratar esse problema é utilizar o tratamento de exeção para identificar as linhas problemáticas e possibilitar a correção dos registros.

Para tratarmos esse problema foi criado o seguinte código:

 BEGIN     

  DECLARE @Id INT, @DtNasc nvarchar(10)

  DECLARE pessoa_cursor CURSOR FOR  SELECT Id,DataNascimento FROM dbo.tPessoa OPEN pessoa_cursor 

 FETCH NEXT FROM pessoa_cursor INTO @Id,@DtNasc 

 WHILE @@FETCH_STATUS = 0 BEGIN 

   BEGIN TRY 

    SELECT CONVERT(DATE,@DtNasc,120)

   END TRY 

   BEGIN CATCH 

    PRINT @Id + ' - ' + @DtNasc

    INSERT INTO dbo.tmp_pessoa_data_erro (Id,DataNascimento) VALUES (@Id,@DtNasc)

   END CATCH

   -- Vai para o próximo registro

   FETCH NEXT FROM pessoa_cursor INTO @Id,@DtNasc   

  END

  CLOSE pessoa_cursor; 

  DEALLOCATE pessoa_cursor; 

END

GO


 Explicação do código

@Id e @DtNasc irão armazenar os valores do Id e DataNascimento da tabela tPessoa respectivamente.

O cursor pessoa_cursor  será utilizado para capturar cada linha da tabela tPessoa   e realizar a validação da data. 

Dentro do comando While cada DataNascimento sofrerá uma tentativa de conversão através da execução da função CONVERT(DATE,@DtNasc,120)  para o formato desejado. Caso ocorra alguma exceção na conversão, o erro será capturado e o código definido na instrução CATCH será executado. Possibilitando o armazenamento das linhas que apresentam problemas na tabela tmp_pessoa_data_erro .

Referência

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-ver15


0
25

Comentários (0)

Tenho mais de dez anos de experiência profissional. Com atuação na área de desenvolvimento , Análise de Sistemas e Business Intelligence

Brasil