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:
Id INT IDENTITY(1,1),
Nome NVARCHAR(100),
DataNascimento NVARCHAR(10)
)
- CREATE TABLE dbo.tmp_pessoa_data_erro(
Id INT,
DataNascimento NVARCHAR(10)
)
- Inclusão de Registros:
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:
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
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 .
Referência
Comentários
Postar um comentário