#16 - BULK INSERT
Autor: Bruno Martins | Publicado: 2011-06-01T17:13:00-03:00

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&nbsp;, 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&nbsp;&nbsp; FROM 'C::\Temp\saldo_201012_v2.txt'&nbsp;&nbsp; WITH &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIELDTERMINATOR =',',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BATCHSIZE = 10000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );

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)
BEGINSET TRANSACTION ISOLATION LEVEL SERIALIZABLE&nbsp;&nbsp; begin transaction
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;SET @SQL ='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BULK INSERT ' + @TABLE + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; FROM ' + @CAMINHO + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WITH &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; (&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;FIELDTERMINATOR ='''+@DEL+''',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;BATCHSIZE = 10000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; )'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @err_instrucao = 'motivo do erro'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec&nbsp;(@SQL)
commit transaction&nbsp;&nbsp; return 0err_instrucao:raiserror (@err_instrucao,16,1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rollback transaction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1END
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&nbsp;INSERT e ADMINISTER BULK OPERATIONS&nbsp;para poder executar.&nbsp;


Para um banco de dados no&nbsp;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&nbsp;modelo de recuperação simples&nbsp;ou no&nbsp;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.
&nbsp;(http://msdn.microsoft.com/en-us/library/ms190422.aspx)