Usuário com melhor resposta
Importar dados de arquivo TXT para tabela SQLServer

Pergunta
-
Olá.
Pretendo importar dados de um arquivo TXT para uma tabela, já criada em SQLServer.
Tentei criar a query usando a sintaxe daqui do msdn, mas achei um tanto dificil e as vezes que rodei a query da erro de parametros.
with dataModule2.qrImportar do
begin
close;
sql.Clear;
sql.Add('Insert into Geraimport select * from');
sql.Add(' OPENROWSET(MSDASQL,Driver={Microsoft Text Driver (*.txt; *.csv)}, ');
sql.add('DefaultDir=C:\coop\coop, ');
sql.Add('SELECT * FROM IMP201310.txt)');
open;
end;
Alguem poderia postar ou informar onde há exemplos?
Obgdo.
- Editado Renato Reis1 quarta-feira, 11 de novembro de 2015 02:37
Respostas
-
Pessoal,
Eu retirei a query do programa e coloquei diretamente a instrução na propriedade SQL do componente da query. Foi a única forma que consegui para poder usar ":", sem que fosse interpretado como parametro.
Vejam: BULK INSERT GERAIMPORT FROM 'c:\coop\coop\IMP_DESCONTOS.txt' WITH (FIELDTERMINATOR = ';')
Obrigado Antonio pela força.
Abc
- Marcado como Resposta Renato Reis1 sexta-feira, 13 de novembro de 2015 16:19
Todas as Respostas
-
Renato, bom dia.
Você pode utilizar o BULK INSERT para fazer isso. O exemplo a seguir importa dados de 2 arquivos txt para a tabela TmpStList:
FileType=1 (TxtFile1.txt)
"Kelly","Reynold","kelly@reynold.com"
"John","Smith","bill@smith.com"
"Sara","Parker","sara@parker.com"FileType=2 (TxtFile2.txt)
Kelly,Reynold,kelly@reynold.com
John,Smith,bill@smith.com
Sara,Parker,sara@parker.comBULK INSERT TmpStList FROM 'c:\TxtFile1.txt' WITH (FIELDTERMINATOR = '","')
BULK INSERT tmpStList FROM 'c:\TxtFile2.txt' WITH (FIELDTERMINATOR = ',')
Abraço,
Antonio Cesar
- Editado Antonio Cesar quarta-feira, 11 de novembro de 2015 09:56
- Sugerido como Resposta Flávio Augusto Lacerda de FariasMVP quarta-feira, 11 de novembro de 2015 18:28
-
-
-
-
Bom dia Antonio.
Inseri assim o código:
with dataModule2.qrImportar do
begin
close;
sql.Clear;
sql.Add('BULK INSERT GERAIMPORT FROM 'c:\coop\coop\IMP201310.txt' WITH (FIELDTERMINATOR = ';')');
open;
end;
e ocorreram os seguintes erros:
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 2, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 3, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 5, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 10, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 11, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 14, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 15, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 17, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 19, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 20, coluna 5 (VALOR).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 22, coluna 5 (VALOR).
Mensagem 4865, Nível 16, Estado 1, Linha 1
Não é possível carregar em massa porque foi excedido o número máximo de erros (10).
Mensagem 7399, Nível 16, Estado 1, Linha 1
O provedor do OLE DB "BULK" para o servidor vinculado "(null)" reportou um erro. O provedor não forneceu informações sobre o erro.
Mensagem 7330, Nível 16, Estado 2, Linha 1
Não é possível buscar uma linha no provedor do OLE DB "BULK" para o servidor vinculado "(null)".A estrutura da tabela está assim:
[FILIADA] [char](4) NULL,
[MATRICULA] [char](5) NULL,
[VERBA] [char](3) NULL,
[FILLER] [char](8) NULL,
[VALOR] [char](10) NULL
Trecho do arquivo TXT onde ocorreu um dos erros:
001;26325;205;;427.6;10;06
001;30127;205;1.01;316.4;10;01
001;26525;205;;1271.09;10;06
001;27400;205;;508.77;10;06
Detalhe do erro:
A terceira linha do trecho do arquivo(acima), contém no quinto campo, um valor superior a 999.99 (1271.09), mas o tipo do campo é char(10), deveria receber o valor.
O que pode estar havendo?
Obrigado
-
-
Antonio,
Aqueles erros foram corrigidos, mas agora são esses, apenas esses:
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 11720, coluna 4 (FILLER).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 12374, coluna 4 (FILLER).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 12595, coluna 4 (FILLER).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 12951, coluna 4 (FILLER).
Mensagem 4863, Nível 16, Estado 1, Linha 1
Erro de conversão dos dados de carregamento em massa (truncamento) na linha 12972, coluna 4 (FILLER).
O trecho iniciando com a linha 11720 do arquivo é:
007;02890;070;12.000055;123.95;10;01
007;02891;070;3.000014;35.91;10;01
007;02891;322;0;134;10;01
e iniciando o trecho a seguir pela 12374
007;04168;070;12.000055;210.96;10;01
007;04168;206;5;207.42;10;01
007;04172;070;2;34.81;10;01Também alterei a estrutura da tabela para:
[FILIADA] [char](4) NULL,
[MATRICULA] [char](5) NULL,
[VERBA] [char](3) NULL,
[FILLER] [char](8) NULL,
[VALOR] [char](10) NULL,
[FILLER1] [char](10) NULL,
[FILLER2] [char](10) NULL
Aproveitando, qual a função do FIELDTERMINATOR na linha de comando?
Abcs
- Editado Renato Reis1 quarta-feira, 11 de novembro de 2015 13:06
-
Bom dia.
Luiz, trabalho com Delphi e atualmente já faço isso, ou seja, leio linha a linha e faço o insert na tabela, mas devido ao grande volume de registros no arquivo txt, este processo está muito demorado.
Obgdo
Não faz sentido criar uma aplicação em C# ou Delphi para isso, o SQL tem ferramentas que vão alem do TSQL para realizar a importação !!!! É reinventar a roda !!!!
Flávio Farias "May the Force be with you" Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
-
Renato,
Perceba que o campo FILLER é char(8). O valor desse campo na linha 11720 é 12.000055 (9 caracteres). Altere o tamanho desse campo. o FIELDTERMINATOR informa qual é o caractere que delimita o campo. No caso do seu arquivo é o ';'.
Antonio Cesar
-
-
Renato,
Por favor marque meu post como resposta ao seu problema.
Obrigado.
Antonio Cesar
- Marcado como Resposta Renato Reis1 quarta-feira, 11 de novembro de 2015 17:18
- Não Marcado como Resposta Renato Reis1 quarta-feira, 11 de novembro de 2015 20:11
-
-
Antonio, usando a instrução via ssms funciona ok, mas quando inseri no código delphi deu pau.
Veja se consegue enxergar algo que ainda não enxerguei.
Obgdo
Através do SSMS utilizando o código, eu consegui, importou tudo ok, mas quando uso o código no delphi apresenta o seguinte erro:
"Project Sistema.exe raised exception class EOleException with message 'Objeto parameter definido incorretamente. As informações são inconsistentes ou incompletas.' Process stopped.
O Código:
xArqImport:='C:\COOP\coop\'+ 'IMP' + inttostr(dbGrupo.KeyValue) + dbcAno.text + dbcMes.text + '.TXT';//xTerminator:=';';with dataModule2.qrImportar dobeginclose;sql.Clear;sql.Add('BULK INSERT GERAIMPORT FROM ' + xArqImport + ' WITH (FIELDTERMINATOR = '+ QuotedStr(';') + ')');open;end;
-
Renato, boa noite.
Como você mesmo mencionou, o comando SQL funciona perfeitamente. O problema ocorreu por um problema na sua sintaxe no Delphi, o que não é minha especialidade. Mesmo assim, veja em que linha ocorreu esse erro e tente identificar o problema. Eu também faria um debug no conteúdo da string contida no comando
sql.Add('BULK INSERT GERAIMPORT FROM ' + xArqImport + ' WITH (FIELDTERMINATOR = '+ QuotedStr(';') + ')');
Pode ser que o conteúdo dessa string possa estar diferente do comando que você testou no SSMS.
Antonio Cesar
-
-
-
Acredito que estou perto de solucionar o problema. A mensagem de erro fala sobre parametro e na instrução sql passagem de parametro é usado com ":", então a instrução está enxergando C:\coop\coop\... como passagem de parametros.
Tentei usar o arquivo vindo de um campo edit2.text sendo carregado em uma variavel do tipo textfile, mas a resposta foi que o arquivo não existe.
Alguem pode me ajudar? Eu preciso fazer que a instrução use o conteúdo da variável.var xArqimp: textfile;
begin
AssignFile ( xArqImp, edit2.text ); // Carrega o Arquivo Descontos
Reset ( xArqImp ); // Reinicia o Arq. descontos a cada leitura do base
with dataModule2.qrImportar do
begin
close;
sql.Clear;
sql.Text:='BULK INSERT GERAIMPORT FROM xArqimp WITH (FIELDTERMINATOR =' + ''';'''+')';
parameters.ParamByName('xArqimp').Value:=edit2.Text;
open;
end;
Obrigado
-
Pessoal,
Eu retirei a query do programa e coloquei diretamente a instrução na propriedade SQL do componente da query. Foi a única forma que consegui para poder usar ":", sem que fosse interpretado como parametro.
Vejam: BULK INSERT GERAIMPORT FROM 'c:\coop\coop\IMP_DESCONTOS.txt' WITH (FIELDTERMINATOR = ';')
Obrigado Antonio pela força.
Abc
- Marcado como Resposta Renato Reis1 sexta-feira, 13 de novembro de 2015 16:19
-