Usuário com melhor resposta
Erro na Importação do arquivo txt

Pergunta
-
Bom dia pessoal
Estou tentando desenvolver uma stored procedure que faça à importação de arquivos txt até ai tudo bem, porém como eu tenho vários arquivos txt em uma determinada pasta eu preciso importar um de cada vez segue o que estou pensando:
CREATE TABLE #Lista (DIRETORIO VARCHAR(613)); CREATE TABLE #FORNECEDORES( TIPO VARCHAR(1), CODIGO INTEGER, NOME VARCHAR(53), CGC VARCHAR(74), ENDERECO VARCHAR(51), BAIRRO VARCHAR(20), CIDADE VARCHAR(32), CEP VARCHAR(20), CXPOSTAL VARCHAR(20), EMAIL VARCHAR(40), TELEFONE VARCHAR(20), TELEX VARCHAR(20), FEDERACAO VARCHAR(03), NUM_PESSOA VARCHAR(09), BAIRRO_COBR VARCHAR(20), CXPOSTAL_COBR VARCHAR(20), CIDADE_COBR VARCHAR(32), CEP_COBR VARCHAR(20), FEDERACAO_COBR VARCHAR(03), AUX VARCHAR(01), EMITENTE1 VARCHAR(09), NOME_ABREV1 VARCHAR(15), AUX2 VARCHAR(01), EMITENTE2 VARCHAR(09), NOME_ABREV2 VARCHAR(15), CGC1 VARCHAR(18), FEDERACAO3 VARCHAR(03)); Insert Into #Lista EXEC master..xp_cmdshell 'dir C:\Pharmacy\dados\1\ /b'; declare @arquivo varchar(100); DECLARE @CAMPO VARCHAR(20); declare @codigo integer; set @arquivo = ''; DECLARE CAR_FORNECEDORES CURSOR FOR select diretorio from #Lista where SUBSTRING(diretorio,1,2) = 'EA'; OPEN CAR_FORNECEDORES FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO WHILE @@FETCH_STATUS = 0 BEGIN SET @arquivo = 'C:\PHARMACY\DADOS\1\' + @CAMPO; bulk insert #FORNECEDORES -- inserir na tabela desejada from @ARQUIVO -- caminho do arquivo e formato with ( CODEPAGE = 'ACP', -- comando necessário para não ter problemas com caracteres especiais como acentos fieldterminator = ';', -- caractere que separa os campos no arquivo rowterminator = '\n' -- referencia para fim da linha ) FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO; END /*SELECT * FROM #Lista*/ CLOSE CAR_FORNECEDORES ; DEALLOCATE CAR_FORNECEDORES; DROP TABLE #Lista; DROP TABLE #FORNECEDORES;
Primeiramente eu crio uma temp #lista onde fica todos os arquivos de uma pasta depois crio um cursos onde concateno o diretorio + o nome do arquivo perfeito, porém quando eu passo o @arquivo para o from do bulk insert ele da erro tem alguma forma deu passar para o from o conteudo da variavel ou outra forma de fazer isso como descrevi acima o erro que da segue abaixo:
Mensagem 102, Nível 15, Estado 1, Linha 49
Incorrect syntax near '@ARQUIVO'.
Respostas
-
Eder.luca,
Tente mudar o trecho do teu cursor, ao invés de usar a variável diretamente, concatenando o valor dela para um varchar e mandando executar:
SET @comando = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ' + @ARQUIVO + ' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') ' exec @comando
Não esquece de criar a variável @comando...
Espero ter ajudado.
[]'s
- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:49
-
Amigo,
Estava falatando 2 aspas, tente o codigo abaixo:
declare @arquivo varchar(8000); declare @caminhocarga varchar(8000); declare @caminhodiretorio varchar(8000); DECLARE @CAMPO VARCHAR(8000); declare @codigo integer; declare @SQL nvarchar(4000) set @arquivo = ''; set @caminhocarga = 'dir C:\Pharmacy\dados\1\ /b'; set @caminhodiretorio = 'C:\Pharmacy\dados\1\'; set @CAMPO = ''; set @codigo = ''; CREATE TABLE #Lista (DIRETORIO VARCHAR(37)); CREATE TABLE #FORNECEDORES( TIPO VARCHAR(1), CODIGO INTEGER, NOME VARCHAR(53), CGC VARCHAR(74), ENDERECO VARCHAR(51), BAIRRO VARCHAR(20), CIDADE VARCHAR(32), CEP VARCHAR(20), CXPOSTAL VARCHAR(20), EMAIL VARCHAR(40), TELEFONE VARCHAR(20), TELEX VARCHAR(20), FEDERACAO VARCHAR(03), NUM_PESSOA VARCHAR(09), BAIRRO_COBR VARCHAR(20), CXPOSTAL_COBR VARCHAR(20), CIDADE_COBR VARCHAR(32), CEP_COBR VARCHAR(20), FEDERACAO_COBR VARCHAR(03), AUX VARCHAR(01), EMITENTE1 VARCHAR(09), NOME_ABREV1 VARCHAR(15), AUX2 VARCHAR(01), EMITENTE2 VARCHAR(09), NOME_ABREV2 VARCHAR(15), CGC1 VARCHAR(18), FEDERACAO3 VARCHAR(03)); Insert Into #Lista EXEC master..xp_cmdshell @caminhocarga; DELETE FROM #Lista WHERE DIRETORIO IS NULL DECLARE CAR_FORNECEDORES CURSOR FOR select diretorio from #Lista where SUBSTRING(diretorio,1,2) = 'EA'; OPEN CAR_FORNECEDORES FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO WHILE @@FETCH_STATUS = 0 BEGIN SET @arquivo = 'C:\Pharmacy\dados\1\' + @CAMPO; SET @SQL = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ''' + @ARQUIVO + ''' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') '; exec sp_executesql @SQL; --SELECT @Sql FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO; END SELECT * FROM #Lista; select * from #FORNECEDORES; CLOSE CAR_FORNECEDORES ; DEALLOCATE CAR_FORNECEDORES; DROP TABLE #Lista; DROP TABLE #FORNECEDORES;
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Editado Fabrizzio CaputoModerator quarta-feira, 3 de abril de 2013 17:56
- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:50
-
Pessoal deu certo o resultado final foi seguinte:
declare @arquivo varchar(8000); declare @caminhocarga varchar(8000); declare @caminhodiretorio varchar(8000); DECLARE @CAMPO VARCHAR(8000); declare @codigo integer; declare @SQL nvarchar(4000) set @arquivo = ''; set @caminhocarga = 'dir C:\Pharmacy\dados\1\ /b'; set @caminhodiretorio = 'C:\Pharmacy\dados\1\'; set @CAMPO = ''; set @codigo = ''; DROP TABLE #Lista; DROP TABLE #FORNECEDORES; CREATE TABLE #Lista (DIRETORIO VARCHAR(37)); CREATE TABLE #FORNECEDORES( TIPO VARCHAR(1), CODIGO INTEGER, NOME VARCHAR(53), CGC VARCHAR(74), ENDERECO VARCHAR(51), BAIRRO VARCHAR(20), CIDADE VARCHAR(32), CEP VARCHAR(20), CXPOSTAL VARCHAR(20), EMAIL VARCHAR(40), TELEFONE VARCHAR(20), TELEX VARCHAR(20), FEDERACAO VARCHAR(03), NUM_PESSOA VARCHAR(60), BAIRRO_COBR VARCHAR(20), CXPOSTAL_COBR VARCHAR(20), CIDADE_COBR VARCHAR(32), CEP_COBR VARCHAR(20), FEDERACAO_COBR VARCHAR(03), AUX_FORNECEDOR VARCHAR(01), EMITENTE1 VARCHAR(14), NOME_ABREV1 VARCHAR(15), AUX2 VARCHAR(03), AUX_CLIENTE VARCHAR(01), EMITENTE2 VARCHAR(09), NOME_ABREV2 VARCHAR(15), AUX4 VARCHAR(3), INSCEST VARCHAR(20), AUX5 VARCHAR(20), FEDERACAO3 VARCHAR(20), ESPACO1 VARCHAR(8), AUX6 VARCHAR(01)); Insert Into #Lista EXEC master..xp_cmdshell @caminhocarga; DELETE FROM #Lista WHERE DIRETORIO IS NULL DECLARE CAR_FORNECEDORES CURSOR FOR select diretorio from #Lista where SUBSTRING(diretorio,1,2) = 'EA'; OPEN CAR_FORNECEDORES FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO WHILE @@FETCH_STATUS = 0 BEGIN SET @arquivo = @caminhodiretorio + @CAMPO; SET @SQL = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ''' + @ARQUIVO + ''' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') '; exec sp_executesql @SQL; set @arquivo = 'del ' + @arquivo; --apagando o arquivo fisico --EXEC MASTER..XP_CMDSHELL @arquivo; FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO; END UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'S' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE 'F'; UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'N' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE ' '; UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'S' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE 'C'; UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'N' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE ' '; UPDATE FN_FORNECEDORES SET RAZAO = #FORNECEDORES.NOME, FANTASIA = #FORNECEDORES.NOME_ABREV1, CKPESSOA = #FORNECEDORES.TIPO, ENDERECO = #FORNECEDORES.ENDERECO, BAIRRO = #FORNECEDORES.BAIRRO, CIDADE = #FORNECEDORES.CIDADE, UF = #FORNECEDORES.FEDERACAO, CEP = #FORNECEDORES.CEP, COMPLEM = #FORNECEDORES.CXPOSTAL, COBENDERECO = #FORNECEDORES.ENDERECO, COBBAIRRO = #FORNECEDORES.BAIRRO_COBR, COBCIDADE = #FORNECEDORES.CIDADE_COBR, COBCEP = #FORNECEDORES.CEP_COBR, COBUF = #FORNECEDORES.FEDERACAO_COBR, STFORNECEDOR = #FORNECEDORES.AUX_FORNECEDOR, STCLIENTE = #FORNECEDORES.AUX_FORNECEDOR, TIPODESPESA = #FORNECEDORES.AUX2, TIPORECEITA = #FORNECEDORES.AUX2, NROPESSOA = #FORNECEDORES.NUM_PESSOA, NROPESSOACOB = #FORNECEDORES.ESPACO1, INSCEST = #FORNECEDORES.INSCEST, USUARIO = 'ADMINISTRADOR', DTATUALIZACAO = GETDATE() FROM #FORNECEDORES WHERE CAST(#FORNECEDORES.CODIGO AS FLOAT) = CAST(FN_FORNECEDORES.CODEXTERNO AS FLOAT); CLOSE CAR_FORNECEDORES ; DEALLOCATE CAR_FORNECEDORES;
Só tenho uma dúvida básica alem do update preciso fazer um insert nessa tabela caso não exista o registro importado do arquivo txt como eu faço essa comparação entre a tabela #fornecedores e a tabela fn_fornecedores caso não exista insere?
- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:41
-
Eder,
Por favor, por esta thread se tratar de problemas na importação, que foi resolvido, favor fechar esta marcando como "resposta" todas as respostas que te ajudaram a solucionar este problema e abrir outra em relação a validação dos datasets de existencia ou não dos valores.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:41
Todas as Respostas
-
Eder.luca,
Tente mudar o trecho do teu cursor, ao invés de usar a variável diretamente, concatenando o valor dela para um varchar e mandando executar:
SET @comando = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ' + @ARQUIVO + ' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') ' exec @comando
Não esquece de criar a variável @comando...
Espero ter ajudado.
[]'s
- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:49
-
eu fiz o seguinte:
DECLARE CAR_FORNECEDORES CURSOR FOR select diretorio from #Lista where SUBSTRING(diretorio,1,2) = 'EA'; OPEN CAR_FORNECEDORES FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO WHILE @@FETCH_STATUS = 0 BEGIN SET @arquivo = 'C:\PHARMACY\DADOS\1\' + @CAMPO; SET @SQL = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ' + @ARQUIVO + ' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') '; exec sp_executesql @SQL; FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO; END
Porém da o seguinte erro:
(2 linha(s) afetadas)
Mensagem 214, Nível 16, Estado 2, Procedimento sp_executesql, Linha 1
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
-
Eder,
Erro simples de datatype, altere o tipo de dados de sua vaariavel @SQL para NVARCHAR, provavelmente esta como VARCHAR.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com -
Alterando o tipo para nvarchar o codigo ficou assim:
declare @arquivo varchar(100); declare @caminhocarga varchar(100); declare @caminhodiretorio varchar(100); DECLARE @CAMPO VARCHAR(20); declare @codigo integer; declare @SQL nvarchar(max) set @arquivo = ''; set @caminhocarga = 'dir C:\Pharmacy\dados\1\ /b'; set @caminhodiretorio = 'C:\Pharmacy\dados\1\'; set @CAMPO = ''; set @codigo = ''; CREATE TABLE #Lista (DIRETORIO VARCHAR(37)); CREATE TABLE #FORNECEDORES( TIPO VARCHAR(1), CODIGO INTEGER, NOME VARCHAR(53), CGC VARCHAR(74), ENDERECO VARCHAR(51), BAIRRO VARCHAR(20), CIDADE VARCHAR(32), CEP VARCHAR(20), CXPOSTAL VARCHAR(20), EMAIL VARCHAR(40), TELEFONE VARCHAR(20), TELEX VARCHAR(20), FEDERACAO VARCHAR(03), NUM_PESSOA VARCHAR(09), BAIRRO_COBR VARCHAR(20), CXPOSTAL_COBR VARCHAR(20), CIDADE_COBR VARCHAR(32), CEP_COBR VARCHAR(20), FEDERACAO_COBR VARCHAR(03), AUX VARCHAR(01), EMITENTE1 VARCHAR(09), NOME_ABREV1 VARCHAR(15), AUX2 VARCHAR(01), EMITENTE2 VARCHAR(09), NOME_ABREV2 VARCHAR(15), CGC1 VARCHAR(18), FEDERACAO3 VARCHAR(03)); Insert Into #Lista EXEC master..xp_cmdshell @caminhocarga; DECLARE CAR_FORNECEDORES CURSOR FOR select diretorio from #Lista where SUBSTRING(diretorio,1,2) = 'EA'; OPEN CAR_FORNECEDORES FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO WHILE @@FETCH_STATUS = 0 BEGIN SET @arquivo = 'C:\Pharmacy\dados\1\' + @CAMPO; SET @SQL = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ' + @ARQUIVO + ' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') '; exec sp_executesql @SQL; FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO; END SELECT * FROM #Lista; select * from #FORNECEDORES; CLOSE CAR_FORNECEDORES ; DEALLOCATE CAR_FORNECEDORES; DROP TABLE #Lista; DROP TABLE #FORNECEDORES;
(2 linha(s) afetadas)
Mensagem 102, Nível 15, Estado 1, Linha 1
Incorrect syntax near 'C:'.
Mensagem 319, Nível 15, Estado 1, Linha 1
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
(2 linha(s) afetadas)
(0 linha(s) afetadas) -
Pessoal resolvi o erro abaixo:
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
esta faltando somente o Mensagem 102, Nível 15, Estado 1, Linha 1
Incorrect syntax near 'C:'. -
Amigo,
Estava falatando 2 aspas, tente o codigo abaixo:
declare @arquivo varchar(8000); declare @caminhocarga varchar(8000); declare @caminhodiretorio varchar(8000); DECLARE @CAMPO VARCHAR(8000); declare @codigo integer; declare @SQL nvarchar(4000) set @arquivo = ''; set @caminhocarga = 'dir C:\Pharmacy\dados\1\ /b'; set @caminhodiretorio = 'C:\Pharmacy\dados\1\'; set @CAMPO = ''; set @codigo = ''; CREATE TABLE #Lista (DIRETORIO VARCHAR(37)); CREATE TABLE #FORNECEDORES( TIPO VARCHAR(1), CODIGO INTEGER, NOME VARCHAR(53), CGC VARCHAR(74), ENDERECO VARCHAR(51), BAIRRO VARCHAR(20), CIDADE VARCHAR(32), CEP VARCHAR(20), CXPOSTAL VARCHAR(20), EMAIL VARCHAR(40), TELEFONE VARCHAR(20), TELEX VARCHAR(20), FEDERACAO VARCHAR(03), NUM_PESSOA VARCHAR(09), BAIRRO_COBR VARCHAR(20), CXPOSTAL_COBR VARCHAR(20), CIDADE_COBR VARCHAR(32), CEP_COBR VARCHAR(20), FEDERACAO_COBR VARCHAR(03), AUX VARCHAR(01), EMITENTE1 VARCHAR(09), NOME_ABREV1 VARCHAR(15), AUX2 VARCHAR(01), EMITENTE2 VARCHAR(09), NOME_ABREV2 VARCHAR(15), CGC1 VARCHAR(18), FEDERACAO3 VARCHAR(03)); Insert Into #Lista EXEC master..xp_cmdshell @caminhocarga; DELETE FROM #Lista WHERE DIRETORIO IS NULL DECLARE CAR_FORNECEDORES CURSOR FOR select diretorio from #Lista where SUBSTRING(diretorio,1,2) = 'EA'; OPEN CAR_FORNECEDORES FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO WHILE @@FETCH_STATUS = 0 BEGIN SET @arquivo = 'C:\Pharmacy\dados\1\' + @CAMPO; SET @SQL = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ''' + @ARQUIVO + ''' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') '; exec sp_executesql @SQL; --SELECT @Sql FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO; END SELECT * FROM #Lista; select * from #FORNECEDORES; CLOSE CAR_FORNECEDORES ; DEALLOCATE CAR_FORNECEDORES; DROP TABLE #Lista; DROP TABLE #FORNECEDORES;
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Editado Fabrizzio CaputoModerator quarta-feira, 3 de abril de 2013 17:56
- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:50
-
-
Eder,
Só sinalizando que o exec estava comentado, acabei de fazer o update em minha resposta. Favor copiar novamente meu script.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com -
Pessoal deu certo o resultado final foi seguinte:
declare @arquivo varchar(8000); declare @caminhocarga varchar(8000); declare @caminhodiretorio varchar(8000); DECLARE @CAMPO VARCHAR(8000); declare @codigo integer; declare @SQL nvarchar(4000) set @arquivo = ''; set @caminhocarga = 'dir C:\Pharmacy\dados\1\ /b'; set @caminhodiretorio = 'C:\Pharmacy\dados\1\'; set @CAMPO = ''; set @codigo = ''; DROP TABLE #Lista; DROP TABLE #FORNECEDORES; CREATE TABLE #Lista (DIRETORIO VARCHAR(37)); CREATE TABLE #FORNECEDORES( TIPO VARCHAR(1), CODIGO INTEGER, NOME VARCHAR(53), CGC VARCHAR(74), ENDERECO VARCHAR(51), BAIRRO VARCHAR(20), CIDADE VARCHAR(32), CEP VARCHAR(20), CXPOSTAL VARCHAR(20), EMAIL VARCHAR(40), TELEFONE VARCHAR(20), TELEX VARCHAR(20), FEDERACAO VARCHAR(03), NUM_PESSOA VARCHAR(60), BAIRRO_COBR VARCHAR(20), CXPOSTAL_COBR VARCHAR(20), CIDADE_COBR VARCHAR(32), CEP_COBR VARCHAR(20), FEDERACAO_COBR VARCHAR(03), AUX_FORNECEDOR VARCHAR(01), EMITENTE1 VARCHAR(14), NOME_ABREV1 VARCHAR(15), AUX2 VARCHAR(03), AUX_CLIENTE VARCHAR(01), EMITENTE2 VARCHAR(09), NOME_ABREV2 VARCHAR(15), AUX4 VARCHAR(3), INSCEST VARCHAR(20), AUX5 VARCHAR(20), FEDERACAO3 VARCHAR(20), ESPACO1 VARCHAR(8), AUX6 VARCHAR(01)); Insert Into #Lista EXEC master..xp_cmdshell @caminhocarga; DELETE FROM #Lista WHERE DIRETORIO IS NULL DECLARE CAR_FORNECEDORES CURSOR FOR select diretorio from #Lista where SUBSTRING(diretorio,1,2) = 'EA'; OPEN CAR_FORNECEDORES FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO WHILE @@FETCH_STATUS = 0 BEGIN SET @arquivo = @caminhodiretorio + @CAMPO; SET @SQL = 'bulk insert #FORNECEDORES ' + -- inserir na tabela desejada 'from ''' + @ARQUIVO + ''' ' + -- caminho do arquivo e formato 'with ' + '( ' + 'CODEPAGE = ''ACP'', '+ -- comando necessário para não ter problemas com caracteres especiais como acentos 'fieldterminator = '';'', ' + -- caractere que separa os campos no arquivo 'rowterminator = ''\n'' ' + -- referencia para fim da linha ') '; exec sp_executesql @SQL; set @arquivo = 'del ' + @arquivo; --apagando o arquivo fisico --EXEC MASTER..XP_CMDSHELL @arquivo; FETCH NEXT FROM CAR_FORNECEDORES INTO @CAMPO; END UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'S' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE 'F'; UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'N' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE ' '; UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'S' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE 'C'; UPDATE #FORNECEDORES SET AUX_FORNECEDOR = 'N' WHERE #FORNECEDORES.AUX_FORNECEDOR LIKE ' '; UPDATE FN_FORNECEDORES SET RAZAO = #FORNECEDORES.NOME, FANTASIA = #FORNECEDORES.NOME_ABREV1, CKPESSOA = #FORNECEDORES.TIPO, ENDERECO = #FORNECEDORES.ENDERECO, BAIRRO = #FORNECEDORES.BAIRRO, CIDADE = #FORNECEDORES.CIDADE, UF = #FORNECEDORES.FEDERACAO, CEP = #FORNECEDORES.CEP, COMPLEM = #FORNECEDORES.CXPOSTAL, COBENDERECO = #FORNECEDORES.ENDERECO, COBBAIRRO = #FORNECEDORES.BAIRRO_COBR, COBCIDADE = #FORNECEDORES.CIDADE_COBR, COBCEP = #FORNECEDORES.CEP_COBR, COBUF = #FORNECEDORES.FEDERACAO_COBR, STFORNECEDOR = #FORNECEDORES.AUX_FORNECEDOR, STCLIENTE = #FORNECEDORES.AUX_FORNECEDOR, TIPODESPESA = #FORNECEDORES.AUX2, TIPORECEITA = #FORNECEDORES.AUX2, NROPESSOA = #FORNECEDORES.NUM_PESSOA, NROPESSOACOB = #FORNECEDORES.ESPACO1, INSCEST = #FORNECEDORES.INSCEST, USUARIO = 'ADMINISTRADOR', DTATUALIZACAO = GETDATE() FROM #FORNECEDORES WHERE CAST(#FORNECEDORES.CODIGO AS FLOAT) = CAST(FN_FORNECEDORES.CODEXTERNO AS FLOAT); CLOSE CAR_FORNECEDORES ; DEALLOCATE CAR_FORNECEDORES;
Só tenho uma dúvida básica alem do update preciso fazer um insert nessa tabela caso não exista o registro importado do arquivo txt como eu faço essa comparação entre a tabela #fornecedores e a tabela fn_fornecedores caso não exista insere?
- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:41
-
Pessoal deixa eu explicar melho o post anterior eu preciso antes de inserir o registro contido na tabela #fornecedores na tabela fn_fornecedores consultar o registro na tabela fn_fornecedores e somente apos isso inserir como eu faço esse insert?
-
Eder,
Por favor, por esta thread se tratar de problemas na importação, que foi resolvido, favor fechar esta marcando como "resposta" todas as respostas que te ajudaram a solucionar este problema e abrir outra em relação a validação dos datasets de existencia ou não dos valores.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta eder.luca quinta-feira, 4 de abril de 2013 14:41