Compartilhando conhecimento com o mundo

Com tecnologia do Blogger.

Pesquisa

Download

Blogger Tricks

Blogger Themes

Visitas

Assuntos

7/08/2015

Error converting data type DBTYPE_DBTIMESTAMP to datetime


Uma tabela do Informix tinha que ser migrada para o SQL Server e todas as vezes que tentava acessar ela pelo SQL Management Studio ocorria o erro abaixo;



Causa deste problema

Fiz um backup unload da tabela e analisando com calma os dados do campo datetime tem alguns registros que foram gravado com segundos 60, o SQL SERVER o segundo vai até 59, é esta a causa do problema;
99020|99887766553150|1|H|2015-05-14 10:23:60||
99032|99887766554102|1|T|2015-08-12 11:14:60||
99043|99887766554116|1|T|2015-03-13 10:39:60||
99054|99887766554180|1|T|2015-12-10 20:32:60||
99061|99887766554173|1|T|2016-06-12 23:00:60||
99073|99887766554142|1|T|2016-09-29 14:12:60||
99082|99887766554170|1|T|2015-02-26 01:21:60||
Pesquisando em diversos sites e em um forum do Informix encontrei uma resposta simples para o banco para isso, no banco de dados Informix a tabela foi criada como (interval year to second) a aplicação deve estar como year to minute.

Solucionando

Temos duas alternativas, alterar na tabela os segundos (de 60 para 59) fazendo um update em cada registro ou alterar o arquivo (do backup unload) para poder carregar os registros no SQL Server, vou fazer esta opção, para fazer isto vou usar o comando (sed -i) que é um comando que são praticamente encontrados em quase todas as distribuições

Tratamento de SED - Alterando o Segundo

Como fiz backup unload vou alterar e converter alguns valores para poder carregar no SQL Server, primeiro vamos alterar o segundo 60 transformar para 59
sed -i s/:60/:59/g Dec_Empresa_Monitorada.unl
Chequei antes para ver se tem :60 em outro lugar e não tem.

Tratamento de SED - Adicionando o comando Insert

Agora vamos colocar o comando de insert neste arquivo
sed -i "s/^/INSERT INTO [dbo].[Dec_Empresa_Monitorada] ([dec_numero],[emp_cnpjcpf],[dem_contador],[dem_situacao],[dem_dthr_insercao],[dem_dthr_atualizacao]) VALUES ('/" Dec_Empresa_Monitorada.unl
Tratamento de SED - Alterando o Pipe 1

Alguns campos estão em branco, vou retirar o pipe e colocar ',''
sed -i "s/||/','');/" Dec_Empresa_Monitorada.unl
Tratamento de SED - Alterando o Pipe 2

Agora vamos separar os pipe (um somente) para ','
sed -i "s/|/','/g" Dec_Empresa_Monitorada.unl
Tratamento de SED - Fechando o comando Insert

Transformando a parte final para poder fechar o insert
sed -i "s/','$/');/" Dec_Empresa_Monitorada.unl
Resultado

Uma parte do arquivo transformado, agora vou pegar o arquivo todo e rodar no SQL Management Studio para inserir na tabela;
INSERT INTO [dbo].[Dec_Empresa_Monitorada] ([dec_numero],[emp_cnpjcpf],[dem_contador],[dem_situacao],[dem_dthr_insercao],[dem_dthr_atualizacao]) VALUES ('66001','11223344500110','1','T','2014-06-27 13:59:56','');
INSERT INTO [dbo].[Dec_Empresa_Monitorada] ([dec_numero],[emp_cnpjcpf],[dem_contador],[dem_situacao],[dem_dthr_insercao],[dem_dthr_atualizacao]) VALUES ('66007','11223344500127','1','T','2014-06-28 18:13:57','');
INSERT INTO [dbo].[Dec_Empresa_Monitorada] ([dec_numero],[emp_cnpjcpf],[dem_contador],[dem_situacao],[dem_dthr_insercao],[dem_dthr_atualizacao]) VALUES ('66064','11223344500177','1','T','2014-06-28 20:51:43','');
INSERT INTO [dbo].[Dec_Empresa_Monitorada] ([dec_numero],[emp_cnpjcpf],[dem_contador],[dem_situacao],[dem_dthr_insercao],[dem_dthr_atualizacao]) VALUES ('66040','11223344500147','1','T','2014-06-28 21:17:39','');
INSERT INTO [dbo].[Dec_Empresa_Monitorada] ([dec_numero],[emp_cnpjcpf],[dem_contador],[dem_situacao],[dem_dthr_insercao],[dem_dthr_atualizacao]) VALUES ('66016','11223344500132','1','T','2014-06-30 07:31:11','');
Rodei este arquivo no SQL Server e rodou ok;

No SQL Server ficou com esta quantidade de linhas
select count(*) from Dec_Empresa_Monitorada

2375
No Informix ficou com esta quantidade;
[s275:informix]$/export/home/informix/backup> echo "select count(*) from Dec_Empresa_Monitorada" | dbaccess efronteiras

Database selected.

      (count(*)) 

            2375

1 row(s) retrieved.
Quantidade de linhas ok;