Nesse post vou mostrar como importar dados de um arquivo texto, de uma forma muito performática. Para isso vou utilizar a instrução T-SQL “BULK INSERT”, vou demonstrar um exemplo simples, utilizarei um arquivo pequeno mas você pode utilizar um arquivo grande.
Arquivo
Criei um arquivo de texto com os seguintes dados, e salve no meu HD.
Maria 56 Feminino
João 45 Masculino
José 48 Masculino
Tereza 16 Feminino
Em seguida executei s instrução SQL
CREATE TABLE #Cliente (Nome VARCHAR(100), Idade INT, Sexo VARCHAR(10)); BULK INSERT #Cliente FROM 'C:\dadosBulk.txt'; SELECT * FROM #Cliente;
Na primeira linha é criado uma tabela temporária, também poderia ser uma tabela física.
Na segunda linha é definida a tabela destino dos dados importados e o caminho físico do arquivo de texto (lembre-se que o SQL Server deve ter acesso a esse caminho, seja caminho local ou caminho de rede)
E por último visualizo todos os dados importados, como segue abaixo
Repare que os caracteres especias não foram considerados na importação, para resolver isso, deve-se utilizar algumas opções do BULK INSERT, como abaixo
BULK INSERT #Cliente FROM 'C:\dadosBulk.txt' WITH (CODEPAGE = 'RAW');
Repere que adicionei mais uma linha, onde determinei que o parâmetro “CODEPAGE” deve ser “RAW”, nele determinamos a pagina de códigos a ser utilizada.
* ACP: Conversão da página de código ANSI/Microsoft Windows (ISO 1252).
* OEM (padrão): Conversão da página de código OEM do sistema para a página de código do SQL Server.
* RAW: Nenhuma conversão de uma página de código em outra ocorre, essa opção é a mais rápida.
* Código da página: É possível passar como parâmetro o código da página.
Executando a instrução acima, temos o resultado:
Outras opções
Tambem temos outras opções:
* FIELDTERMINATOR: Determina o caractere(s) separador do campo, por padrão é \t (tab), mas pode ser modificado para vírgula por exemplo.
* ROWTERMINATOR: Determina o caractere(s) separador do fim da linha, por padrão é \n (quebra de linha), também pode ser modificado.
* BATCHSIZE: Determina o número de lotes que a importação deve fazer, por padrão é 1, aumentar esse número pode degradar a performance da instrução.
* FIRSTROW: Determina o número da linha inicial que a instrução BULK deve considerar, por padrão o valor é 1, ele é útil quando a primeira linha é composta pelos títulos das colunas, por exemplo.
* MAXERRORS: Determina a quantidade máxima de erros que podem ocorrer na importação (número de colunas inválidos por exemplo) antes de ser cancelada, o valor padrão é 10.
* ORDER: Determina a ordem da importação, é recomendado que se utilize um índice clusterizado na tabela de destino. O algoritmo de ordenação irá degradar a performance da importação, estude com cuidado o uso dessa opção, o ideal é evitar.
* ERRORFILE: Determina um caminho de destino para linhas que não puderam ser importadas.
* TABLOCK: Determina que um bloqueio no nível de tabela é adquirido durante a operação de importação, manter um bloqueio durante a operação de importação em massa reduz a contenção de bloqueio na tabela e em alguns casos pode melhorar significativamente o desempenho.
Importando um arquivo colunas separadas por vírgula
Maria,56,Feminino|
João,45,Masculino|
José,48,Masculino|
Tereza,16,Feminino|
BULK INSERT #Cliente FROM 'C:\dadosBulk.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '|', CODEPAGE = 'RAW');
Com mais opçãos:
BULK INSERT #Cliente FROM 'C:\dadosBulk.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '|', CODEPAGE = 'RAW', BATCHSIZE = 2, FIRSTROW = 2, MAXERRORS = 10, ERRORFILE = 'C:\dadosBulk_erro.txt', TABLOCK);
Até a próxima pessoal!
Sds André, tudo bem?
Tentei executar teu script do começo, mas aparece as seguintes mensagens:
Msg 4832, Level 16, State 1, Line 1
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider “BULK” for linked server “(null)” reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider “BULK” for linked server “(null)”.
Tem alguma ideia do que possa ser?
Olá Vitor, tudo bem e você?
Segue alguns dos possíveis motivos:
* O arquivo de dados tem um número diferente de campos que a tabela de destino (em relação as colunas da tabela);
* A ordem da coluna é diferente para o arquivo de dados
* O caracter de terminação (ROWTERMINATOR) é diferente entre as colunas do arquivo de dados;
Tem como você colocar aqui os dados do arquivo e seu exemplo de importação?
Dependendo do jeito que você salvou o arquivo, a codificação pode não estar estar definida corretamente no script de BULK.
Att,
André