Pular para o conteúdo principal

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

 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 a sua execução 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 - As seguintes tabelas deverão ser criadas: 
              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 registro que provocaram os erros capturados pelo Try Catch.

  • Inclusão 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  foi desenvolvida 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 será formatada.

             

            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ática e possibilitar a correção dos registros.

             

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

             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

            As variáveis @Id  e @DtNasc irão armazenar os valores do Id e DataNascimento  da tabela tPEssoa respectivamente.

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

            Dentro do comando While cada data de nascimento 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 .

             

            Conclusão

            O contexto criado foi apenas uma ilustração para mostrar um possível exemplo do uso do Try..Catch. Existem outros recursos que poderão ser utilizados com essa estrutura conforme a documentação da Microsoft. Espero poder contribuir com o entendimento do uso deste importante recurso do Sql Server.

            Referência

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



            Comentários

            Postagens mais visitadas deste blog

            Validando Documentos com Fluent Validation, DocsBRValidator e .net Core 6.0

              Introdução A necessidade de utilização das bases de dados para construção de estratégias de negócios através  de técnicas de Ciência de Dados torna necessário que as aplicações sejam cada vez mais cuidadosas para a validação dos campos que serão salvos nas bases dos sistemas. Esses cuidados tem o objetivo de melhorar a qualiade das informações que serão fornecidas para sistemas de Inteligência artificial, mineração de dados, etc . Neste artigo será apresentada a construção de uma solução console que utiliza o Fluent Validation, DocsBRValidator  e o .net Core 6 para validar o número do CPF fornecido pelo usuário.   FluentValidation FluentValidation é uma bliblioteca .Net criada para construção de regras de validação. Com essa biblioteca  podem ser definidos a obrigatoriedade de campos , os tamanhos, os tipos e a formatação.   DocsBRValidator DocsBRValidator é uma biblioteca que possui a regra de validação para os principais documentos brasileiros como...

            Tutorial de Lógica de Programação com a Linguagem C e C++ - Arrays e Matrizes - Aula 05

              1. Vetores (Matrizes Unidimensionais) e Matrizes Vetores e matrizes são uma coleção de variáveis do mesmo tipo referenciadas por apenas um nome. Cada elemento de um vetor e uma matriz são acessados através de índices. A declaração de um vetor segue a seguinte sintaxe int notas[3]; Em C uma string é definida através da declaração de um vetor de char. Conforme o exemplo abaixo: char nome[50]; o primeiro elemento de um vetor ocupa o índice de posição 0 (zero) Ex: char nome[50] nome =  A declaração de uma matriz segue a seguinte sintaxe int gavetas[3][3];

            Tutorial de Lógica de Programação com a Linguagem C e C++ - Introdução - Aula 01

            1. Conceitos Básicos Antes de iniciarmos o uso de uma linguagem de programação precisamos entender alguns conceitos básicos que estão dentro do universo da criação de software de computadores. Basicamente , estes conceitos respondem às seguintes perguntas: O que é Lógica de Programação? Disciplina que busca o encadeamento e organização do pensamento para a implementação de algoritmos através de uma linguagem de programação O que são Algoritmos?           Sequência de passos que visam atingir um objetivo bem definido  Exemplo de Algoritmo: Trocar uma lâmpada queimada  pegar uma escada; posicionar a escada debaixo da lâmpada; buscar uma lâmpada nova subir na escada retirar a lâmpada velha colocar a lâmpada nova O que é uma Linguagem de Programação ?         É a linguagem capaz de definir instruções que irão materializar um algoritmo para um computador 2. A Linguagem C   C é uma linguagem de programação que possui...