none
Criar procedure para fazer bulk insert

    Question

  •  

    Olá meu amigo, estava vendo este conteúdo e gostaria que se possivel vc me desse uma aula sobre a 4º e 5º linha desta procedure, pois tenho que fazer bulk insert de TXT com nomes diferentes e gostaria de automatizar esta função.

     

     

     

     

    Declare @Arquivo varchar(100)
    Declare @bulk  varchar(100)

    select @Arquivo =  'c:\teste\teste.txt'

    Select @bulk = 'bulk insert # exemplo from ''' + @Arquivo + ''''

     

    Exec (@bulk)

    Monday, February 04, 2008 12:18 PM

All replies

  •  

    Olá Rafael!

     

    Vamos ver se consigo tem ajudar.

     

    Para entender melhor, vou explicar o contrário, a quinta linha faz utilização do EXEC, instrução que pode ser usada para executar uma string contendo instruções SQL, neste caso, essa string é criada na quarta linha em conjunto com a linha anterior onde é informado o caminho para o arquivo texto desejado.

     

    Se quiser, pode fazer um pequeno teste, para ver o que está dentro da string, simplemente substitua o "Exec (@bulk)" por "PRINT @bulk". Dessa forma poderá ver o conteúdo da String e assim saber o que está sendo executado.

     

     

    Sobre a sua solução, vou usar um exemplo que uso num cliente, onde preciso saber quais arquivos se encontram num diretório e então fazer a leitura deles, e no final simplesmente limpo o diretório para que na próxima vez sejam lidos apenas os novos arquivos. Imagino que seja mais ou menos essa a sua necessidade. Vamos ver se conseguirá usar:

     

    Code Snippet

    alter proc dbo.spuBulkAutomatico

    -- recebe o caminho que vai conter os

    -- arquivos (o Temp é o default, só como exemplo)

    @Caminho varchar (200) = 'C:\temp\',

    -- Nome da tabela que vai receber os dados

    -- importados (default = ##tabela, coloque o nome da tabela que geralmente via receber

    -- os dados das suas importações)

    @tabela varchar (100) = '##tabela'

    as

    set nocount on

    -- Criação da tabela que vai receber os

    -- nomes dos arquivos que vão ser lidos

    create table #tmp (out varchar (1000))

    -- Declaração de variáveis que serão usadas no decorrer do processo

    declare @arquivo varchar (1000), @sql varchar (1000),

    @cmd varchar (1000), @min int, @max int

    -- Formação do comando que será usado no DOS para listar os arquivos

    select @cmd = 'dir ' + @caminho + '*.txt /b'

    -- Insere os arquivos dentro da tabela para usar depois

    insert into #tmp (out)

    exec xp_cmdshell @cmd

    -- apaga registros que não tem arquivo .txt

    delete from #tmp where out not like '%.txt' or out is null

    -- Altera a tabela para colocar coluna com auto incremento, para controle

    alter table #tmp add id int identity (1,1)

    -- Configurações para repetição

    select @min = min (id), @max = max (id) from #tmp

    while @min <= @max

    begin

    -- passa por cada arquivo

    select @arquivo = out from #tmp where id = @min

    -- monta a instrução SQL para fazer o BULK INSERT

    select @sql = 'bulk insert ' + @tabela + ' from ''' + @caminho + @arquivo + ''''

    -- executa a string montada na linha anterior

    exec (@sql)

    -- incrementa variável de controle para passar para o próximo arquivo

    set @min = @min + 1

    end

    -- drop da tabela temporária usada

    drop table #tmp

    -- deleta os arquivos do diretório, mas você quiser, pode mover para outro local

    -- usando um MOVE

    select @cmd = 'del ' + @caminho + '*.txt /Q'

    exec (@sql)

     

     

     

    Para usar essa SP, pode chamar ela dessa forma:

     

    Code Snippet

    -- primeiro parâmetro é o caminho dos arquivos,

    -- o segundo é a tabela que vai receber os dados

    EXEC dbo.spuBulkAutomatico 'd:\Diretorio\Arquivos\', 'TabelaDeDados'

     

     

    Dessa forma, irá passar tanto o diretório onde estão os arquivos txt, quanto a tabela que vai receber os dados.

     

     

    Bom, espero que leh ajude. Qualquer coisa, retorne.

     

     

    Abraço!!!

     

    Tuesday, February 05, 2008 3:32 AM