quarta-feira, 1 de junho de 2011

#16 - BULK INSERT

Algumas pessoas tem por costume fazer a importação de arquivos através do wizard do sql que é o jeito mais tradicional e fácil, que depois posso fazer um tutorial de como utilizar. Mas hoje recebi um email na lista de SQL SERVER pedido ajuda para criar uma procedure para importar um arquivo txt.


O SQL SERVER tem uma função é o BULK INSERT , ela é responsável por fazer fazer esse tipo de importação, você pode delimitar os separadores de linha, o que vale lembrar que este tipo de função não permite dar carga em campos específicos. O arquivo já deve estar totalmente formatado de acordo a tabela.

Um exemplo simples de como utilizar seria esse:


BULK INSERT DEC.dbo.Tab_Pernambucanas
   FROM 'C::\Temp\saldo_201012_v2.txt'
   WITH
      (
         FIELDTERMINATOR =',',
         BATCHSIZE = 10000
      );


Uma maneira de fazer uma procedure para esse tipo de inserção seria:


CREATE PROCEDURE IMPORTACAO (@TABLE VARCHAR(100),@CAMINHO VARCHAR(255), @DEL CHAR)
AS

declare @SQL VARCHAR(1000)
declare @err_instrucao varchar(255)

BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   begin transaction

       SET @SQL ='      BULK INSERT ' + @TABLE + '
                     FROM ' + @CAMINHO + '
                     WITH
                          (
                              FIELDTERMINATOR ='''+@DEL+''',
                              BATCHSIZE = 10000
                          )'
                         
      SET @err_instrucao = 'motivo do erro'
      exec (@SQL)

commit transaction
   return 0
err_instrucao:
raiserror (@err_instrucao,16,1)
      rollback transaction
      return 1
END

Essa é a minha sugestão, outros terão sugestões bem diferentes e todas as sugestões são bem vindas e ajudam no nosso crescimento profissional.

Outra informação importante é que esse tipo de instrução precisa de das seguintes permissões INSERT e ADMINISTER BULK OPERATIONS para poder executar. 


Para um banco de dados no modelo de recuperação completa, todas as operações de inserção de linha executadas pela importação em massa são registradas completamente no log de transações. Importações de dados grandes poderão fazer o log de transações ficar cheio rapidamente se o modelo de recuperação completa for usado. Por outro lado, no modelo de recuperação simples ou no modelo de recuperação bulk-logged, o log mínimo de operações de importação em massa reduz a possibilidade de uma operação de importação em massa preencher o espaço do log. O log mínimo também é mais eficiente que o log completo.
 (http://msdn.microsoft.com/en-us/library/ms190422.aspx)

Nenhum comentário:

Postar um comentário