Podemos usar o comando BULK INSERT do SQL Server para copiar (importar) dados de um arquivo-texto ou nativo do SQL Server (também chamados de flat file).

É o modo mais rápido de se importar dados; porém somente trabalha em uma direção e com um tipo de arquivo: flat file. Iniciamos nosso exemplo criando a estrutura, usando o SSMS (SQL Server Management Studio) do SQL Server 2005:


USE MASTER
IF EXISTS(SELECT * FROM SYSDATABASES WHERE NAME = ‘EXEMPLO_COPIA’)
 DROP DATABASE EXEMPLO_COPIA
–
CREATE DATABASE EXEMPLO_COPIA
GO
–
USE EXEMPLO_COPIA
–
CREATE TABLE PRODUTO 
(
COD INT,
NOME VARCHAR(50),
PRECO DEC(9,2)
)

Em seguida, criamos o arquivo-texto que contém os dados que serão importados.

Ainda no SSMS, executamos o seguinte comando:


BULK INSERT PRODUTO 
FROM ‘C:\PRODUTOSTAB.TXT’

Agora fazemos um select para confirmar a importação:


SELECT * FROM PRODUTO

No final do select vemos que os acentos não foram importados corretamente. Para corrigir isso atribuímos o valor ACPao parâmetro CODEPAGE.


BULK INSERT PRODUTO
FROM ‘C:\PRODUTOSTAB.TXT’
WITH (CODEPAGE=‘ACP’)

Tome o cuidado de truncar a tabela (apagar os dados) antes de importar novamente. Para essa tarefa, use o comando:


TRUNCATE TABLE PRODUTO

Os parâmetros mais usados do BULK INSERT são:

  • CODEPAGE - define a página de códigos a ser usada na importação - e, por consequência, se os caracteres vêm acentuados ou não;
  • MAXERRORS - define a quantidade máxima de erros que pode ocorrer numa importação de dados;
  • FIELDTERMINATOR - caractere usado para separar uma coluna da outra (o default é o caractere TAB, representado por \t;
  • ROWTERMINATOR - caractere usado para separar uma linha (registro) da outra (o default é o ENTER, representado por \n;
  • FIRE_TRIGGERS - se informado, dispara as triggers na execução do comando (por default o BULK INSERT não dispara triggers);
  • KEEP_IDENTITY - se informado, impede que a numeração automática (coluna identity da tabela) seja usada - vai “obedecer” os códigos informados;
  • FORMATFILE - define qual o arquivo de formato será usado na importação;
  • FIRSTROW - define qual será a primeira linha importada;
  • LASTROW - define qual será a última linha importada.

Por exemplo:


BULK INSERT PRODUTO 
FROM ‘C:\PRODUTOSTAB.TXT’
WITH 
(
 FORMATFILE=‘C:\PRODUTOSTAB.FMT’, 
 CODEPAGE=‘ACP’, 
 MAXERRORS = 0,
 FIRE_TRIGGERS,
 FIRSTROW = 1,
 LASTROW = 10
)