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
  • Pessoal, blz?

    Estou começando a atuar com o SQL Server, e preciso adicionar uma variável ao caminho do diretório (bulk insert), pois as pastas de onde iremos importar os arquivos para uma tabela mudam dinamicamente. Tentei, até o momento, as linhas abaixo, mas acredito que não seja desta maneira.

    DECLARE  @ANO VARCHAR (10)
    DECLARE  @MES VARCHAR (10)
    DECLARE  @DIA NVARCHAR (10)
    DECLARE @CAMINHO NVARCHAR(50)

    SET @ANO =YEAR(GETDATE())
    SET @MES =MONTH(GETDATE())
    SET @DIA =DAY(GETDATE())
    SET @CAMINHO = 'C:\'

    BULK
    INSERT [csm].[ftteste]
    FROM @CAMINHO +@DIA
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
    )

    Poderiam dar uma força?

    Muito obrigado!

    Wednesday, October 26, 2016 6:40 PM
  • Lucas,

    Neste caso você vai ter que montar o seu código Bulk Insert de forma dinâmica, declarando ele dentro de uma variável e posteriormente concatenando com a varíavel do caminho, após isso realizar a execução desta variável contendo toda sua estrutura de código.

    Veja se este bloco de código ajuda:

    USE DB_XRX_DOC
    Go 
    
    Set NoCount On 
    
    
     
    
     If Object_Id ('tempdb..#Documento_Teste') Is Not Null
      Drop Table #Documento_Teste
    
    Go 
      
    
     Create Table #Documento_Teste 
    
      (  id_Doc  Int Identity (1,1) ,
         nm_Path Varchar (50) );
    
    ---=============================================================================
    --  LE O DIRETORIO E INSERI TODOS OS PATHS LIDOS NA TABELA TEMPORARIO 
    ---=============================================================================
    
    
    Insert Into  #Documento_Teste  (nm_Path) 
    
    EXEC master..xp_cmdshell 'dir c:\teste  /b' ;---- PODE USAR AQUI UMA VARIAVEL COMO PARAMETRO DE ENTRADA DE UMA PROCEDURE 
     
    ---=============================================
    --- APAGA REGISTROS NULOS SE TIVER  
    ---=============================================
    
    
     Delete From #Documento_Teste Where nm_Path Is Null ; 
     
    ---=============================================
    --- APAGA REGISTROS NULOS SE TIVER  
    ---=============================================
    
     Declare @nm_Arquivo      Varchar(50)
     Declare @Path            Varchar(80)
     Declare @SQL             Varchar(1000)
    
     Set @Path = 'c:\teste\'   -- PODE USAR AQUI UMA VARIAVEL COMO PARAMETRO DE ENTRADA DE UMA PROCEDURE 
    
    
     Declare cCursor_Image Cursor  For
    
       Select Distinct 
    
              nm_Path
    
         From  #Documento_Teste ;
    
    
     Open  cCursor_Image 
    
     Fetch Next From cCursor_Image Into @nm_Arquivo 
    
     While @@Fetch_Status  = 0 
    
     Begin
    
    
    
    Select @SQL = 'INSERT INTO Documento_Teste (nm_Path,im_Doc) ' + char(13)
    
    Select @SQL = @SQL + 'SELECT nm_Doc = ''' +  @Path + @nm_Arquivo + ''', * '+ char(13) 
    Select @SQL =  @SQL + 'FROM OPENROWSET(BULK '''+  @Path + @nm_Arquivo + ''' , SINGLE_BLOB) AS Document'
    
    Execute ( @SQL )
    --Select @SQL
    
    Fetch Next From cCursor_Image Into @nm_Arquivo 
    
    
      End 
    
    Close cCursor_Image
    Deallocate cCursor_Image
    
    
    Set NoCount Off
    Go 
     


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    Thursday, October 27, 2016 1:37 PM