none
Importar dados de arquivo TXT para tabela SQLServer RRS feed

  • 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
    quarta-feira, 11 de novembro de 2015 02:23

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
    sexta-feira, 13 de novembro de 2015 16:18

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.com

    BULK INSERT TmpStList FROM 'c:\TxtFile1.txt' WITH (FIELDTERMINATOR = '","')

    BULK INSERT tmpStList FROM 'c:\TxtFile2.txt' WITH (FIELDTERMINATOR = ',')

    Abraço,

    Antonio Cesar



    quarta-feira, 11 de novembro de 2015 09:54
  • Bom dia.

    Eu criaria uma aplicação em c# para ler cada linha do .txt separa por delimitador em um vetor, validar e gerar os inserts.

    quarta-feira, 11 de novembro de 2015 10:59
  • 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

    quarta-feira, 11 de novembro de 2015 11:50
  • Renato,

    Tente usar o BULK INSERT, pois acredito que vai ser bem mais rápida a importação.

    Abraço,

    Antonio Cesar

    quarta-feira, 11 de novembro de 2015 12:07
  • 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



    quarta-feira, 11 de novembro de 2015 12:22
  • Renato,

    Sua tabela tem 5 campos, mas o arquivo tem 7 campos. Tente incluir os 2 campos faltantes na tabela e teste novamente.

    Antonio Cesar

    quarta-feira, 11 de novembro de 2015 12:41
  • 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;01

    També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
    quarta-feira, 11 de novembro de 2015 13:04
  • 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 !!!!

    Importação e Exportação - SQL


    Flávio Farias "May the Force be with you" Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 11 de novembro de 2015 13:04
  • 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

    quarta-feira, 11 de novembro de 2015 13:13
  • Antonio,

    Perfeito!! Realmente não percebi a mudança do tamanho do campo. Alterei todos para 15 e rodei o código.

    Todas as linhas foram importadas.

    Muito Obrigado pela sua ajuda.

    Att

    Renato

    quarta-feira, 11 de novembro de 2015 13:35
  • 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
    quarta-feira, 11 de novembro de 2015 13:38
  • Use um algorítimo de compreensão de processamentos com seleção decentralizada.

    Muito provável que vá aumentar o tempo de resposta.

    quarta-feira, 11 de novembro de 2015 13:57
  • 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 do
          begin
            close;
            sql.Clear;
            sql.Add('BULK INSERT GERAIMPORT FROM ' + xArqImport + ' WITH (FIELDTERMINATOR = '+ QuotedStr(';') + ')');
            open;
          end;

    quarta-feira, 11 de novembro de 2015 20:13
  • 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

    quarta-feira, 11 de novembro de 2015 23:49
  • Reinventar a roda já transformou garotos em SEO com um capital assustador.
    quinta-feira, 12 de novembro de 2015 10:52
  • Tomara que eu seja um deles. Deus esteja ouvindo suas palavras enquanto ora e eu enquanto trabalho!
    quinta-feira, 12 de novembro de 2015 12:50
  • 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

    sexta-feira, 13 de novembro de 2015 01:52
  • 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
    sexta-feira, 13 de novembro de 2015 16:18
  • Renato, bom dia.

    Se teve algum post que foi válido para você, proponha como resposta ou vote como útil.

    Obrigado,

    Antonio Cesar

    segunda-feira, 16 de novembro de 2015 11:12