none
Erro na Importação do arquivo txt RRS feed

  • 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'.

    quarta-feira, 3 de abril de 2013 14:23

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
    quarta-feira, 3 de abril de 2013 14:52
  • 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


    quarta-feira, 3 de abril de 2013 17:51
    Moderador
  • 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
    quarta-feira, 3 de abril de 2013 19:57
  • 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
    quinta-feira, 4 de abril de 2013 13:00
    Moderador

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
    quarta-feira, 3 de abril de 2013 14:52
  • 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'.

    quarta-feira, 3 de abril de 2013 17:28
  • 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

    quarta-feira, 3 de abril de 2013 17:30
    Moderador
  • 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)

    quarta-feira, 3 de abril de 2013 17:45
  • 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:'.

    quarta-feira, 3 de abril de 2013 17:51
  • 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


    quarta-feira, 3 de abril de 2013 17:51
    Moderador
  • Vou testar e posto novamente

    quarta-feira, 3 de abril de 2013 17:54
  • 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

    quarta-feira, 3 de abril de 2013 17:57
    Moderador
  • 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
    quarta-feira, 3 de abril de 2013 19:57
  • 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?
    quarta-feira, 3 de abril de 2013 20:06
  • 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
    quinta-feira, 4 de abril de 2013 13:00
    Moderador