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
Comentários (0)