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

dadosBulk

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:

dadosBulk2.

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!