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 CPF, CNPJ,  RG, CNH, Titulo de El

            Criando uma calculadora Android com o Kotlin

            Resumo Aprender a programar para Android exige a absorção de conceitos básicos que são mais naturalmente entendidos quando aplicados em algum projeto de desenvolvimento. Objetivando introduzir o contato com o Kotlin para Android, foi criado neste artigo um aplicativo simples de calculadora que possibilita a apresentação do tratamento de eventos de botões, uso de expressões regulares e utilização de um método estático. Introdução O desenvolvimento de aplicativos envolve o entendimento de conceitos que devem ser naturalizados pelos desenvolvedores. Uma das formas mais comuns de se naturalizar os diversos recurso de uma plataforma é desenvolver projetos que demonstrem o funcionamento prático dos conceitos implementados. O aplicativo   Calculadora foi desenvolvido por possibilitar o contato inicial do desenvolvedor com os conceitos de tratamento de eventos, métodos estáticos e expressões regulares. O código desenvolvido buscou implementar estes conceitos de maneira introdutória. Não fo

            Logic Programming With Python - 03

            Control Flow We often need to run specific code for certain conditions or we must run a code snippet many times. Toward we have this behavors we need of structures of control flow. Basically these structures are divided into conditional and repeating structures.  Conditional structures allow select code snippets for specific conditions while Loop structures allow the execution of code snippets many times. Conditional structures in Python The logical conditionals usein Python are: Equals:  a == b Not Equals:  a != b Less than:  a < b Less than or equal to:  a <= b Greater than:  a > b Greater than or equal to:  a >= b These conditions are fundamental to statement logical and loops Simple if-statement. In this example were declared two variables: a and b. In the if-statement  was defined the condition b > a. As b is equal the five and a is equal to three the message "b greater than a" will show to the user. Code Block In Python, The code block is defined through