locked
Verificar SE arquivo .txt já foi importado RRS feed

  • Pergunta

  • Bom dia Pessoas....

    Estou desenvolvendo meu tcc e estou com uma grande dificuldade na importação de arquivos de texto...

    Já tá tudo importando bunitinho, mas o problema é que não consigo fazer uma verificação se o arquivo já foi importado.... Após a importação eu estou movendo o arquivo par outra pasta mas, isso não impede de que o arquivo seja importado novamente. Alguém pode me ajudar ? Eu estou desesperado rs.... Aguardo resposta...


    • Editado solrso terça-feira, 17 de junho de 2014 15:48
    terça-feira, 17 de junho de 2014 13:52

Todas as Respostas

  • Amigo, bom dia.

    Poste seu código aqui que a gente ajuda a mudar a lógica.

    Provavelmente é somente fazer uma correção simples no código e seu problema será resolvido.

    Abraços !


    Diego Murakami View Diego Murakami's LinkedIn profile - MCP, MS, MCSD
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 17 de junho de 2014 14:33
  • OOpa Diego.. Segue o código abaixo :

    no aguardo...

                                                                    

    USE [AGUA_LOG]
    GO
    /****** Object:  StoredProcedure [dbo].[PROCEDURE_BAIXA]    Script Date: 06/16/2014 15:01:16 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER PROCEDURE [dbo].[PROCEDURE_BAIXA] 

    AS
    BEGIN
      CREATE TABLE #ALLFILENAMES(WHICHFILE varchar(MAX))
       CREATE TABLE #TEXTOS(REG Varchar(MAX)NULL)
    DECLARE
    @filename varchar(255),
                @path     varchar(255),
                @sql      varchar(8000),
                @cmd      varchar(1000),
                @TABELA     varchar(max)
                DECLARE @DTATUAL AS SMALLDATETIME
    SET @DTATUAL = GETDATE()

      SET @TABELA = '#TEXTOS'
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

       SET @path = 'C:\AGUALOG\ARQUIVOS\'
        SET @cmd = 'dir ' + @path + '*.TXT /b'
        INSERT INTO  #ALLFILENAMES
        EXEC Master..xp_cmdShell @cmd
        --UPDATE #ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null
    --SELECT SUBSTRING (REG,280,40) FROM #textos

        --cursor loop
        declare c1 cursor for SELECT * FROM #ALLFILENAMES where WHICHFILE like  '%P047D1B%' or  WHICHFILE like '%P036D1B%' or WHICHFILE like '%P024D1B%'
        open c1
        fetch next from c1 into @filename
        While @@fetch_status <> -1
          begin
          --bulk insert won't take a variable name, so make a sql and execute it instead:
           set @sql = ''+      
                     'bulk insert '+@TABELA+' ' +       
                     'from '''+  @PATH+@filename+''' ' +      
                     'with ('+       
                           'RowTerminator=''\n'', '+      
                           'CODEPAGE=''RAW'', '+      
                           'KEEPNULLS' +      
                           ')'  

        print @sql
        exec (@sql)

      Set @Cmd = 'Move /y '+rTrim(@PATH+@filename) + ' C:\AGUALOG\IMPORTADOS\'+ rIGHT('0000'+LTRIM(YEAR(@DTATUAL)),4)+'\'+ rIGHT('00'+LTRIM(MONTH(@DTATUAL)),2) +'\'+   rIGHT('00'+LTRIM(DAY(@DTATUAL)),2)+'\'      
          EXECUTE master.dbo.xp_cmdshell @Cmd

          fetch next from c1 into @filename
          end
        close c1
        deallocate c1

    --NUMEROS NÃO PRECISAM DE ASPAS SIMPLES
    --- COM LETRAS USA-SE 4 ASPAS SIMPLES MAIS 2 APÓS AS STRINGS E A VIRGULA
    --FALTA O BANCO ->
       SELECT 'INSERT INTO BAIXA ([COD_CONTRATO]
          ,[LOTE_MENSAL]
          ,[RGI]
          ,[MES_REF_CONTA]
          ,[NUM_CONTA_BANCO]
          ,[AGENCIA_BANCARIA]
          ,[NUMERO_BANCO] 
          ,[DATA_MOVI]
          ,[DATA_PAG]
          ,[NUM_ACORDO]
          ,[NUM_PARCELA_PAGA]
          ,[DATA_VENC]
          ,[VLR_PAGO]
          ,[COD_TIPO_ARRECADACAO]
          ,[UN]
          ,[MUNICIPIO]
      ) VALUES (' +
         SUBSTRING (REG,1,3)+','+
         SUBSTRING (REG,4,6)+','+
         SUBSTRING (REG,10,10)+','+
              SUBSTRING (REG,20,6)+','+
              SUBSTRING (REG,26,13)+','+
              SUBSTRING (REG,39,4)+','+
              SUBSTRING (REG,43,3)+','+
             ''''+cast(SUBSTRING(reg,46,4)as varchar)+'.'+cast(SUBSTRING(reg,52,2)as varchar)+'.'+cast(SUBSTRING(reg,50,2)as varchar)+''','+
              SUBSTRING (REG,54,8)+','+
              SUBSTRING (REG,83,6)+','+
              SUBSTRING (REG,89,2)+','+
              SUBSTRING (REG,62,8)+
              ','+SUBSTRING (REG,70,13)+
              ','+''''+SUBSTRING (REG,91,1)+''','+
              SUBSTRING (REG,92,3)+','+
              SUBSTRING (REG,95,5)+ ')'
           --''+SUBSTRING (REG,94,3)+','''+''+CAST(SUBSTRING (REG,114,10)AS nvarchar)+''','+''+SUBSTRING (REG,221,20)+
           --''+SUBSTRING (REG,241,1)+','''+''+CAST(SUBSTRING (REG,242,13)AS nvarchar)+''','+''+SUBSTRING (REG,255,13)+','''+SUBSTRING (REG,268,12)+')'
           AS CMD
      INTO #TMPCMD3
      FROM #TEXTOS

      where SUBSTRING (REG,1,13) not in ('0000000000000','9999999999999') 

         SELECT 'INSERT INTO RODAPE_BAIXA ([NOME_ARQUIVO]
          ,[DATA]
          ,[HORA]
          ,[QTDEREGISTROS]
          ,[VALORTOTAL]
      ) VALUES (' +

              ''''+cast(SUBSTRING (REG,14,16)as varchar)+
              ''','+''''+cast(SUBSTRING (REG,30,8)as varchar)+
              ''','+''''+cast(SUBSTRING (REG,38,8)as varchar)+''','+
              ''''+cast(SUBSTRING (REG,46,8)as varchar)+''','+
              ''''+cast(SUBSTRING (REG,54,13)as varchar)+''''+ ')'
           --''+SUBSTRING (REG,94,3)+','''+''+CAST(SUBSTRING (REG,114,10)AS nvarchar)+''','+''+SUBSTRING (REG,221,20)+
           --''+SUBSTRING (REG,241,1)+','''+''+CAST(SUBSTRING (REG,242,13)AS nvarchar)+''','+''+SUBSTRING (REG,255,13)+','''+SUBSTRING (REG,268,12)+')'
           AS CMD
      INTO #TMPCMD2
      FROM #TEXTOS

      where SUBSTRING (REG,1,13) = 9999999999999
    --SELECT SUBSTRING (REG,280,30)FROM #TEXTOS
      -- Ler cada linha comando sql gerada, que esta na tabela temporaria
      -- e executar 
      DECLARE @CMD4 NVARCHAR(MAX)
      Declare Cur_Arq Cursor For      
      Select CMD
      From #TMPCMD3

      Open Cur_Arq      
      Fetch Next From Cur_Arq Into @CMD4
      While @@Fetch_Status = 0       
      Begin      

        EXECUTE SP_EXECUTESQL @CMD4

        --select @CMD2 as comando


        Fetch Next From Cur_Arq Into @CMD4

      END  
      close cur_arq
      deallocate cur_arq
       DECLARE @CMD3 NVARCHAR(MAX)
      Declare Cur_Arq Cursor For      
      Select CMD
      From #TMPCMD2

      Open Cur_Arq      
      Fetch Next From Cur_Arq Into @CMD3
      While @@Fetch_Status = 0       
      Begin      

        EXECUTE SP_EXECUTESQL @CMD3

        --select @CMD2 as comando


        Fetch Next From Cur_Arq Into @CMD3

      END  
      close cur_arq
      deallocate cur_arq

    END
    DROP TABLE #ALLFILENAMES
    DROP TABLE #TEXTOS
    DROP TABLE #TMPCMD2
    DROP TABLE #TMPCMD3

    terça-feira, 17 de junho de 2014 15:02
  • no aguardo....
    terça-feira, 17 de junho de 2014 15:24
  • Solrso,

    Uma alternativa é configurar o uso de Extended Procedures e tentar utilizar a Extended Procedure não Documentada, XP_FileExists.

    Veja se ajuda:

    declare @Path varchar(128), @FileName varchar(128)
    
    select @Path = 'C:\' , @FileName = 'myfile.txt'
    
    declare @i int
    declare @File varchar(1000)
    
    select @File = @Path + @FileName
    exec master..xp_fileexist @File, @i out
    
    if @i = 1
    print 'exists'
    else
    print 'not exists'



    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Sugerido como Resposta Durval Ramos sexta-feira, 20 de junho de 2014 13:28
    quarta-feira, 18 de junho de 2014 15:38
    Moderador
  • Obrigado Amigo mais, não funcionou para o que eu quero no momento.. 

    esses comandos verificam a existencia de arquivos em uma pasta certo ? eu preciso abrir o arquivo de texto e verificar se o mesmo já foi importado por exemplo: recebemos diariamente vários arquivos para ser importado para o banco com milhares de linhas sendo que a primeira linha informa a data, o horário e o nome do arquivo. OU SEJA, esses arquivos só podem ser importados uma única vez. Preciso verificar a primeira linha de cada arquivo se a hora, a data e o nome do arquivo já estão lá. Se tiver ignorar esses arquivos.... Se puder me ajudar, agradeço !!!!!

    Estou aguardando respostas...

    sábado, 21 de junho de 2014 03:30
  • solrso,

    Cara abrir um arquivo texto não é funcionalidade do SQL Server, mas até da para ser feito.

    Através do comando bcp, você poderia importar o conteúdo deste arquivo para uma table dentro do SQL Server e depois disso fazer um select verificando o conteúdo da primeira linha de registro, para ver se contém o que você esta querendo.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 27 de junho de 2014 14:33
    Moderador