none
bulk insert não acha arquivo RRS feed

  • Pergunta

  • FAÇÇO UM BULK INSERT DA SEGUINTE MANEIRA:

    SET @SQL = 'BULK INSERT TABELA '
    SET @SQL = @SQL + ' FROM ' + ''''+CONVERT(VARCHAR,@DIRETORIO)+CONVERT(VARCHAR,@ARQUIVO)+''''
    SET @SQL = @SQL + ' WITH ( '
    SET @SQL = @SQL + 'FIRSTROW = 2, '
    SET @SQL = @SQL + 'FIELDTERMINATOR = ' + ''''+CONVERT(VARCHAR,@DELIMITADOR)+'''' + ', '
    SET @SQL = @SQL + 'ROWTERMINATOR = ''\n'', '
    SET @SQL = @SQL + 'CODEPAGE = ''ACP'' '
    SET @SQL = @SQL + ') '
    exec(@sql)
    SET @SQL = NULL



    E MEU ARQUIVO ESTÁ EM C:\TESTE\ARQUIVOS_TXT\20130205\COMP_MOV_LIVRE_05022013.TXT

    SÓ QUE NÃO CONSIGO CARREGAR. DÁ UM ERRO DIZENDO QUE O ARQUIVO (C:\TESTE\ARQUIVOS_TXT\20130205\COMP_MOV) NÃO EXISTE. O QUE NOTEI QUE NÃO ESTÁ PEGANDO O DIRETÓRIO COMPLETO, OU SEJA, O CAMINHO COMPLETO.
    ESTÁ CORTANDO O NOME DO ARQUIVO. 

    A MINHA DÚVIDA É, NÃO TEM COMO AUMENTAR O TAMANHO DA STRING DO BULK QUE PEGA O DIRETÓRIO DE ONDE ESTÁ O ARQUIVO? PERGUNTO, PORQUE EM BREVE VOU TER QUE PEGAR DA REDE E O DIRETÓRIO SERÁ MAIOR.
    terça-feira, 5 de fevereiro de 2013 12:21

Respostas

  • Qual a versão do seu sql ? Veja se na parte de convert para varchar as variaveis, ao inves de colocar somente varchar tente especificar no convert o tamanho das variaveis:

    declare @arquivo varchar(1000)
    declare @diretorio varchar(1000)
    declare @sql varchar(8000)
    declare @delimitador varchar(100)
    
    set @arquivo = 'COMP_MOV_LIVRE_05022013.TXT'
    set @diretorio = 'C:\TESTE\ARQUIVOS_TXT\20130205\'
    set @delimitador = '|'
    
    SET @SQL = 'BULK INSERT TABELA '
     SET @SQL = @SQL + ' FROM ' + ''''+CONVERT(VARCHAR(1000),@DIRETORIO)+CONVERT(VARCHAR(1000),@ARQUIVO)+''''
     SET @SQL = @SQL + ' WITH ( '
     SET @SQL = @SQL + 'FIRSTROW = 2, '
     SET @SQL = @SQL + 'FIELDTERMINATOR = ' + ''''+CONVERT(VARCHAR,@DELIMITADOR)+'''' + ', '
     SET @SQL = @SQL + 'ROWTERMINATOR = ''\n'', '
     SET @SQL = @SQL + 'CODEPAGE = ''ACP'' '
     SET @SQL = @SQL + ') '
     
     select @sql


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta rafa-martin quarta-feira, 6 de fevereiro de 2013 13:03
    quarta-feira, 6 de fevereiro de 2013 10:25

Todas as Respostas

  • Rafa, antes do exec de um "select @SQL" para ver o comando que o sql estaria executando, talvez a variavel @sql ou @arquivo não estejam com o tamanho adequado.

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 5 de fevereiro de 2013 13:03
  • mais minha variável @sql é varchar(8000)  e e @arquivo varchar(2000)
    terça-feira, 5 de fevereiro de 2013 13:50
  • antes do exec coloque um "select @sql" e poste aqui para vermos como esta saindo o comando e podermos ajustar na query...

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 5 de fevereiro de 2013 13:52
  • Rafa, poste também o tamanho e contéudo da variável @DIRETORIO e @ARQUIVO

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    terça-feira, 5 de fevereiro de 2013 14:48
  • vejam:

    BULK INSERT #TEMP_COLUNAS_DINAMICA  FROM 'C:\TESTE\ARQUIVOS_TXT\20130205\COMP_MOV' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '|', ROWTERMINATOR = '\n', CODEPAGE = 'ACP' ) 

    o nome do meu arquivo é: COMP_MOV_LIVRE_05022013.TXT vejam que está cortando.

    variábel @sql é varchar(8000)

    variábel @arquivo varchar(1000)

    variável @diretorio varchar(1000).

    acho que é uma limitação do comando bulk.

    terça-feira, 5 de fevereiro de 2013 15:02
  • ok Rafa, muito bom.

    Agora por gentileza, coloque o conteúdo da variável @arquivo e @diretorio

    SET @SQL = 'BULK INSERT TABELA '
     SET @SQL = @SQL + ' FROM ' + ''''+CONVERT(VARCHAR,@DIRETORIO)+CONVERT(VARCHAR,@ARQUIVO)+''''
     SET @SQL = @SQL + ' WITH ( '
     SET @SQL = @SQL + 'FIRSTROW = 2, '
     SET @SQL = @SQL + 'FIELDTERMINATOR = ' + ''''+CONVERT(VARCHAR,@DELIMITADOR)+'''' + ', '
     SET @SQL = @SQL + 'ROWTERMINATOR = ''\n'', '
     SET @SQL = @SQL + 'CODEPAGE = ''ACP'' '
     SET @SQL = @SQL + ') '
     exec(@sql)
     SET @SQL = NULL
     
     print @sql
     
     print @arquivo
     
     print @diretorio

    Abs.

    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    terça-feira, 5 de fevereiro de 2013 15:10
  • cara, o conteúdo eu já coloquei. veja: diretório: C:\TESTE\ARQUIVOS_TXT\20130205\ e arquivo: COMP_MOV_LIVRE_05022013.TXT. só que se vc reparar bem o nome do arquivo está sendo cortado.
    terça-feira, 5 de fevereiro de 2013 15:33
  • Muito estranho, repliquei aqui sua query com os parametros e funcionou normalmente no sql 2008 R2:

    declare @arquivo varchar(1000)
    declare @diretorio varchar(1000)
    declare @sql varchar(8000)
    declare @delimitador varchar(100)
    
    set @arquivo = 'COMP_MOV_LIVRE_05022013.TXT'
    set @diretorio = 'C:\TESTE\ARQUIVOS_TXT\20130205\'
    set @delimitador = '|'
    
    SET @SQL = 'BULK INSERT TABELA '
     SET @SQL = @SQL + ' FROM ' + ''''+CONVERT(VARCHAR,@DIRETORIO)+CONVERT(VARCHAR,@ARQUIVO)+''''
     SET @SQL = @SQL + ' WITH ( '
     SET @SQL = @SQL + 'FIRSTROW = 2, '
     SET @SQL = @SQL + 'FIELDTERMINATOR = ' + ''''+CONVERT(VARCHAR,@DELIMITADOR)+'''' + ', '
     SET @SQL = @SQL + 'ROWTERMINATOR = ''\n'', '
     SET @SQL = @SQL + 'CODEPAGE = ''ACP'' '
     SET @SQL = @SQL + ') '
     
     select @sql


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 5 de fevereiro de 2013 16:02
  • estranho, porque não funciona.

    mais blz. eu vou buscar o arquivo do diretório e renomeá-lo para depois ler o mesmo.

    de qualquer forma, obrigado.

    terça-feira, 5 de fevereiro de 2013 17:13
  • mesmo voce rodando o exemplo que fiz não funciona pra vc ?

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 5 de fevereiro de 2013 17:18
  • uma coisa interessante, repare que ele pegou o nome do arquivo até o primeiro espaço em branco, faça um teste colocando aspas duplas no inicio e fim do arquivo para ver se funciona...ou então só para fazer um teste voce tem como mudar o nome do arquivo para retirar os espaços em branco ?

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 5 de fevereiro de 2013 21:17
  • vc vê el não pegou até o primeiro espaço em branco. na verdade o primeiro espaço em branco é depois da palavra compromissada.

    eu já tentei colocar o underline (_) no lugar dos espaços e mesmo assim nada. e mesmo com as aspas duplas não rola.

    alguma outro sugestão? 

    terça-feira, 5 de fevereiro de 2013 21:47
  • Qual a versão do seu sql ? Veja se na parte de convert para varchar as variaveis, ao inves de colocar somente varchar tente especificar no convert o tamanho das variaveis:

    declare @arquivo varchar(1000)
    declare @diretorio varchar(1000)
    declare @sql varchar(8000)
    declare @delimitador varchar(100)
    
    set @arquivo = 'COMP_MOV_LIVRE_05022013.TXT'
    set @diretorio = 'C:\TESTE\ARQUIVOS_TXT\20130205\'
    set @delimitador = '|'
    
    SET @SQL = 'BULK INSERT TABELA '
     SET @SQL = @SQL + ' FROM ' + ''''+CONVERT(VARCHAR(1000),@DIRETORIO)+CONVERT(VARCHAR(1000),@ARQUIVO)+''''
     SET @SQL = @SQL + ' WITH ( '
     SET @SQL = @SQL + 'FIRSTROW = 2, '
     SET @SQL = @SQL + 'FIELDTERMINATOR = ' + ''''+CONVERT(VARCHAR,@DELIMITADOR)+'''' + ', '
     SET @SQL = @SQL + 'ROWTERMINATOR = ''\n'', '
     SET @SQL = @SQL + 'CODEPAGE = ''ACP'' '
     SET @SQL = @SQL + ') '
     
     select @sql


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta rafa-martin quarta-feira, 6 de fevereiro de 2013 13:03
    quarta-feira, 6 de fevereiro de 2013 10:25
  •  nossaaa cara!! não tinha pensado nisso. deu certo.

    eu uso isso em outros script meus, mais nem cogitei isso no bulk.

    blz. valeu!!!

    quarta-feira, 6 de fevereiro de 2013 13:03
  • Show de bola, as vezes um detalhe que faz a diferença.

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 6 de fevereiro de 2013 13:10