Inquiridor
Verificar SE arquivo .txt já foi importado

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
- 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 #TMPCMD3terç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:38Moderador -
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:33Moderador