Você está na página 1de 29

Importação de dados em massa no SQL Server1

artigo escrito por ​José Diz​, editor de ​Porto SQL​.

Sumário
1. Introdução 3

2. Fontes de dados 4
2.1. Arquivos de texto 4
2.1.1. Formato CSV 4
2.1.2. Formato DSV 4
2.1.3. Formato TSV 5
2.1.4. Tamanho fixo de colunas 5
2.1.5. Formato XML 5
2.1.6. Formato JSON 6
2.2. Planilha eletrônica 7
2.3. Banco de dados 7
2.3.1. Banco de dados Access 7
2.3.2. Banco de dados dBase 7

3. Métodos de importação 8
3.1. instrução BULK INSERT 8
3.2. função OPENROWSET 8
3.2.1. OPENROWSET (provedor OLE DB ...) 8
3.2.2. OPENROWSET (BULK ...) 9
3.3. utilitário BCP 9
3.4. Integration Services 9
3.5. Assistente de importação 9
3.6. Vinculação de servidores 10
3.7. função OPENXML 10
3.8. função OPENJSON 10

4. Importação de dados 11
4.1. Provedores OLE DB 13
4.2. Arquivo texto com colunas de tamanho fixo 13
4.2.1. Usando BULK INSERT 13
4.2.2. Usando OPENROWSET 14
4.2.3. Usando BCP 15
4.3. Arquivo texto no formato CSV 15
4.3.1. Usando BULK INSERT 16

1
Versão 2.2a, de 5 de abril de 2019 @9h UTC-3.

1
Importação de dados em massa no SQL Server

4.3.2. Usando OPENROWSET 16


4.3.3. Usando BCP 17
4.4. Arquivo texto no formato XML 18
4.5. Arquivo texto no formato JSON 19
4.6. Planilha eletrônica 19
4.6.1. Usando OPENROWSET 19
4.6.2. Usando vinculação de servidores 20
4.7. Banco de dados Access 21
4.7.1. Usando OPENROWSET 21
4.7.2. Usando a vinculação de servidores 22
4.8. Banco de dados dBase 23

5. Arquivo de formato 24
5.1. Introdução aos arquivos de formato 24
5.2. Mapeamento entre campos e colunas 25
5.2.1. Mais colunas do que campos 25
5.2.2. Menos colunas do que campos 26
5.2.3. Ordem diferente de colunas e campos 27

6. Referências 29
6.1. Documentação SQL Server 29
6.2. Outras fontes de consulta 29

2
Importação de dados em massa no SQL Server

1. Introdução
A importação de dados em massa é um processo corriqueiro em ambientes de BI (business
intelligence), em que informações de diversas fontes têm que ser incorporadas a uma base
de dados para uso posterior pelas ferramentas de análise. Pode ocorrer também nas cargas
periódicas de ​data warehouses​; em ambientes em que há processos que ainda não foram
incorporados aos sistemas da organização; ou ainda nos casos em que a fonte de dados é
externa à organização. Geralmente a importação de dados tem como origem arquivos texto
mas podem também ser arquivos com formatos específicos, como no caso de planilhas
eletrônicas, ou até de outros gerenciadores de bancos de dados.
No SQL Server algumas opções para a importação de arquivos são:
● instrução BULK INSERT;
● função OPENROWSET;
● utilitário BCP;
● Integration Services;
● Assistente de importação;
● Assistente de migração (SSMA).
A ferramenta a ser utilizada depende da fonte de dados, sendo que para algumas fontes de
dados há várias opções. Neste artigo o objetivo é demonstrar a utilização de scripts em
T-SQL para efetuar a importação de dados.

3
Importação de dados em massa no SQL Server

2. Fontes de dados
Este capítulo descreve os principais formatos de arquivos de dados que usualmente são
utilizados como fonte para importação de dados em massa.

2.1. Arquivos de texto


Arquivos de texto corrido são muito utilizados para intercâmbio de dados. A característica
dos arquivos de texto é que permitem a leitura e edição através de editores de texto.
Geralmente o conteúdo do arquivo de texto segue algum formato.

2.1.1. Formato CSV


Um dos formatos mais antigos para intercâmbio de dados é conhecido como CSV, que é a
sigla de ​comma-separated values​. O arquivo é composto de linhas e campos, onde o
separador entre cada campo usualmente é o caractere “​,​” (vírgula).
Como exemplo arquivo CSV que contenha nome, local de nascimento e data de
nascimento:

Anne Jacqueline Hathaway​,​Nova Iorque​,​12/11/1982


Rachel Hannah Weisz​,​Westminster​,​7/3/1970
Scarlett Ingrid Johansson​,​Nova Iorque​,​22/11/1984

O formato de arquivo CSV não é totalmente padronizado, embora exista a RFC 4180. A
ideia básica de separar campos com uma vírgula é clara, mas essa ideia fica complicada
quando os dados de campo também podem conter vírgulas ou até quebras de linha
incorporadas.

2.1.2. Formato DSV


Outro formato de arquivo, mais flexível do que o CSV, é conhecido por ​delimiter-separated
values (DSV), onde o separador de campos pode ser outro caractere além da vírgula e
usualmente cada campo vem delimitado por aspas.

"Anne Jacqueline Hathaway"​|​"Nova Iorque"​|​"12/11/1982"


"Rachel Hannah Weisz"​|​"Westminster"​|​"7/3/1970"
"Scarlett Ingrid Johansson"​|​"Nova Iorque"​|​"22/11/1984"

No exemplo acima o separador utilizado é o caractere “​|​”. Novamente deve-se citar a falta
de padronização neste formato, existindo variações como com ou sem cabeçalho na
primeira linha; o caractere utilizado para delimitar os campos de texto; etc.

4
Importação de dados em massa no SQL Server

2.1.3. Formato TSV


No formato de arquivo ​tab-separator values (TSV) o separador de campos é o caractere HT
(​horizontal tabulatio​n, 09 em hexa no conjunto de caracteres ascii).

Anne Jacqueline Hathaway Nova Iorque 12/11/1982


Rachel Hannah Weisz Westminster 7/3/1970
Scarlett Ingrid Johansson Nova Iorque 22/11/1984

No exemplo acima entre cada campo há o caractere HT, não visível.

2.1.4. Tamanho fixo de colunas


Além dos formatos tratados anteriormente, também é usual que os campos em um arquivos
texto tenham tamanho fixo, não existindo separador de campos.

1...5....0....5....0....5....0....5....0....5....0....5
Anne Jacqueline Hathaway Nova Iorque 12/11/1982
Rachel Hannah Weisz Westminster 07/03/1970
Scarlett Ingrid Johansson Nova Iorque 22/11/1984

Para facilitar a compreensão, no exemplo acima foi acrescentada uma linha inicial para
funcionar como régua: 1, 5, 10, 15, 20 etc. O primeiro campo possui tamanho fixo de 30
caracteres; o segundo campo possui tamanho fixo de 15 caracteres e o terceiro campo com
10 caracteres.

2.1.5. Formato XML


XML, sigla de ​eXtensible Markup Language​, originalmente um formato para a criação de
documentos multimídia com dados organizados de forma hierárquica, passou a ter outras
utilizações, principalmente para o intercâmbio de informações. Assim como outras
linguagens de marcação, XML lida com instruções embutidas no corpo do documento
denominadas de ​tags,​ que permitem a descrição dos dados. Pela sua portabilidade, já que
é um formato que não depende das plataformas de hardware ou de software, um banco de
dados pode, através de uma aplicação, escrever em um arquivo XML e um outro banco
distinto pode ler então estes mesmos dados.
No verbete sobre XML na wikipedia (vide item ​Outras fontes de consulta​, ao final) há
detalhes sobre o formato e inclusive a aplicação de XML em banco de dados.
No formato XML os dados podem estar armazenados nos elementos (​element centric)​ , nos
atributos (​attribute centric​) ou uma mistura de ambos. Seguem exemplos dos dois casos
para o mesmo conjunto de dados.

5
Importação de dados em massa no SQL Server

element centric:
<Atriz>
<nome>Anne Jacqueline Hathaway</nome>
<local_nascimento>Nova Iorque</local_nascimento>
<data_nascimento>12/11/1982</data_nascimento>
</Atriz>
<Atriz>
<nome>Rachel Hannah Weisz</nome>
<local_nascimento>Westminster</local_nascimento>
<data_nascimento>07/03/1970</data_nascimento>
</Atriz>
<Atriz>
<nome>Scarlett Ingrid Johansson</nome>
<local_nascimento>Nova Iorque</local_nascimento>
<data_nascimento>22/11/1984</data_nascimento>
</Atriz>

attribute centric:​
<Atriz nome="Anne Jacqueline Hathaway" local_nascimento="Nova
Iorque" data_nascimento="12/11/1982"/>
<Atriz nome="Rachel Hannah Weisz" local_nascimento="Westminster"
data_nascimento="07/03/1970"/>
<Atriz nome="Scarlett Ingrid Johansson" local_nascimento="Nova
Iorque" data_nascimento="22/11/1984"/>

Observa-se que a forma ​attribute centric gera arquivos menores. Há vantagens e


desvantagens nas duas estruturas, mas não é objetivo deste artigo tratar disto.

2.1.6. Formato JSON


JSON, acrônimo de ​JavaScript Object Notation,​ é um formato de troca de dados entre
sistemas independente de linguagem de programação, embora originado no contexto do
JavaScript. É um arquivo de texto no formato atributo-valor (natureza auto-descritiva).
No verbete sobre JSON na wikipedia (vide item ​Outras fontes de consulta​, ao final) há
detalhes sobre o formato e inclusive comparação com o formato XML.

[ {"nome":"Anne Jacqueline Hathaway", "local_nascimento":"Nova


Iorque", "data_nascimento":"12\/11\/1982"},
{"nome":"Rachel Hannah Weisz", "local_nascimento":"Westminster",
"data_nascimento":"07\/03\/1970"},
{"nome":"Scarlett Ingrid Johansson", "local_nascimento":"Nova
Iorque", "data_nascimento":"22\/11\/1984"} ]

6
Importação de dados em massa no SQL Server

2.2. Planilha eletrônica


Dos primeiros programas de planilha eletrônica que me lembro de ter utilizado um deles foi
o Lotus 1-2-3, no sistema operacional MS-DOS. O outro foi o SuperCalc, para
computadores de 8 bits e sistema operacional CP/M. Me lembro também do Quatro Pro, da
Borland. Até que a Microsoft lançou o Excel e passou a dominar o mercado de planilhas
eletrônicas.
Os arquivos gerados pelo Excel geralmente possuem extensão xls ou xlsx, sendo formatos
proprietários. Outro padrão também utilizado é o OpenDocument Format, usualmente com
extensão ods para as planilhas eletrônicas. Atualmente tanto o Excel quanto o LibreOffice
Calc manipulam os principais formatos disponíveis.
Há componentes de software que permitem o acesso direto a esses arquivos, sem
necessidade de conversão prévia para algum arquivo com formato de intercâmbio de
dados.

2.3. Banco de dados


Outra fonte de dados são bancos de dados de outros gerenciadores de banco de dados que
não sejam SQL Server.

2.3.1. Banco de dados Access


Os arquivos gerados pelo software de banco de dados Microsoft Access possuem formato
próprio para armazenar os dados. Há componentes de software que permitem o acesso
direto a esses arquivos, sem necessidade de conversão prévia para algum arquivo com
formato de intercâmbio de dados.

2.3.2. Banco de dados dBase


O formato DBF foi utilizado pelo software de banco de dados dBase, bem como por outros
softwares que utilizam o mesmo formato (Clipper, FoxBase etc). Há componentes de
software que permitem o acesso direto a esses arquivos, sem necessidade de conversão
prévia para algum arquivo com formato de intercâmbio de dados.

7
Importação de dados em massa no SQL Server

3. Métodos de importação
Neste capítulo serão descritos os principais métodos de importação de dados em massa
disponíveis no SQL Server.

3.1. instrução BULK INSERT


Importa um arquivo de dados para uma tabela ou exibição de banco de dados em um
formato especificado pelo usuário no SQL Server.
O formato básico é

BULK INSERT ​tabela_ou_exibição_de_destino


from '​arquivo_de_dados​'
with ( ​opções​ );

onde:
● a denominação da ​tabela (ou exibição) de destino permite a definição do nome do
banco de dados e também do esquema;
● o nome do ​arquivo de dados pode conter o caminho completo do arquivo a ser
importado, que deve deve estar em uma unidade de disco (inclusive rede, disco
flexível, disco rígido etc). Caso o arquivo esteja em uma unidade remota, deve-se
utilizar o formato UNC (vide glossário);
● as ​opções variam de acordo com versão do SQL Server e também com o formato
do arquivo a importar.
Na documentação da instrução BULK INSERT (vide item ​Documentação SQL Server​, ao
final) constam informações detalhadas sobre cada opção.

3.2. função OPENROWSET


A função OPENROWSET permite o acesso a dados externos de diversos formatos
utilizando fonte de dados OLE DB. A função pode ser referenciada na cláusula FROM de
uma consulta como se fosse um nome de tabela; também pode ser referenciada como a
tabela de destino de uma instrução INSERT, UPDATE ou DELETE, dependendo das
funcionalidades do provedor OLE DB utilizado.

3.2.1. OPENROWSET (​provedor OLE DB​ ...)


Conforme documentação da função, o primeiro parâmetro é um provedor OLE DB:

OPENROWSET ( '​provider_name​' ,
{ '​datasource'​ ; '​user_id​' ; '​password​' | '​provider_string​' } ,
{ [ ​catalog​. ] [ ​schema​. ] ​object​ | '​query'​ }
)

8
Importação de dados em massa no SQL Server

O segundo e terceiro parâmetros possuem formatos variados, dependendo do provedor


OLE DB utilizado. Na documentação da função (vide item ​Documentação SQL Server​, ao
final) constam informações sobre cada item.

3.2.2. OPENROWSET (BULK ...)


Outra forma de utilização da função OPENROWSET é utilizar a forma BULK, que atua como
provedor de conjuntos de linhas em massa. A função OPENROWSET (BULK...) permite
acessar dados remotos conectando-se a uma fonte de dados remota. A maioria das opções
são semelhantes às disponíveis na instrução BULK INSERT. Os detalhes encontram-se na
documentação da função (vide item ​Documentação SQL Server​, ao final).

OPENROWSET (BULK '​arquivo_de_dados​',


FORMATFILE = '​arquivo_de_formato​' [ ​opções​ ]
)

3.3. utilitário BCP


O utilitário BCP (​b​ulk ​c​opy ​p​rogram) transfere dados entre instância do SQL Server e
arquivo externo, utilizando arquivo de formato definido pelo usuário.
A sintaxe básica do utilitário para importação é

BCP ​tabela_ou_exibição_de_destino​ in ​arquivo_de_dados​ [ ​opções​ ]

A maioria das opções são semelhantes às disponíveis na instrução BULK INSERT.


Na documentação do utilitário BCP (vide item ​Documentação SQL Server​, ao final) constam
informações detalhadas sobre cada opção.

3.4. Integration Services


O SSIS é a ferramenta do SQL Server para a execução de ETL (extração, transformação e
carregamento). Pode extrair e transformar dados de uma ampla variedade de fontes, como
arquivos de dados XML, arquivos simples e fontes de dados relacionais e transferir dados
para um ou mais destinos.

3.5. Assistente de importação


O Assistente de Importação é uma forma interativa de definir a origem e destino bem como
o tratamento a realizar durante a importação. É gerado um pacote DTS, que pode ser salvo
e modificado posteriormente no Integration Services.

9
Importação de dados em massa no SQL Server

3.6. Vinculação de servidores


O propósito da vinculação de servidores é estabelecer a ligação entre bancos de dados
SQL Server armazenados em diferentes servidores/instâncias bem como com bancos de
dados de outros gerenciadores. Como o recurso utilizado para a ligação é um provedor OLE
DB, é possível utilizar esse recurso para estabelecer ligação entre uma instância local e
uma fonte de dados OLE DB que não seja gerenciador de banco de dados.

3.7. função OPENXML


OPENXML é uma função com valor de tabela que analisa texto XML e retorna os elementos
e atributos como linhas e colunas. Pode ser utilizada na cláusula FROM de uma instrução
Transact-SQL exatamente como é usada qualquer outra tabela, exibição ou função com
valor de tabela.

OPENXML ( ​idoc​, r​owpattern​ [, ​flags​ ] ) [ ​cláusula_with​ ]

Os detalhes de utilização encontram-se na documentação da função (vide item


Documentação SQL Server​, ao final).

3.8. função OPENJSON


OPENJSON é uma função com valor de tabela que analisa texto JSON e retorna os objetos
e as propriedades da entrada JSON como linhas e colunas. Pode ser utilizada na cláusula
FROM de uma instrução Transact-SQL exatamente como é usada qualquer outra tabela,
exibição ou função com valor de tabela. Disponível a partir da versão 2016 do SQL Server.

OPENJSON ( ​expressão JSON​ [ , ​caminho​ ] ) [ ​cláusula_with​ ]

Os detalhes de utilização encontram-se na documentação da função (vide item


Documentação SQL Server​, ao final).

10
Importação de dados em massa no SQL Server

4. Importação de dados
Este capítulo contém exemplos de importação de arquivos, ao relacionar as fontes de dados
com os métodos de importação. Para as demonstrações estão disponíveis vários arquivos;
você pode obtê-los ao copiar o pacote ImportaDados_3.zip disponível em ​GDrive/pub/SQL​.
Os arquivos a serem importados possuem 100 mil linhas, cada um, exceto o xls, cujo limite
é de 65536 linhas. Nos exemplos os arquivos de dados a serem importados estão na pasta
\Downloads da unidade C do computador onde está instalado o SQL Server. Caso opte por
copiar para outra pasta, ajuste os exemplos conforme a localização física em seu
computador.
A tabela para onde serão importados os arquivos contém a seguinte estrutura:

-- código #4.1
CREATE DATABASE stageDB;
go

ALTER DATABASE stageDB SET RECOVERY BULK_LOGGED WITH NO_WAIT;


go

USE stageDB;

CREATE TABLE dbo.tbCliente (


ChaveSub int identity unique,
Nome varchar(50) not null,
DataNasc date not null,
Gênero char(1) not null check (Gênero in ('M', 'F'))
);

Ao executar o código acima será criado um banco de dados para testes e a tabela para
onde serão importados os arquivos.
Além da tabela de clientes, para os exemplos será utilizada outra tabela em que serão
acumuladas automaticamente (através de procedimentos de gatilho) algumas estatísticas.

-- código #4.2
USE stageDB;

CREATE TABLE dbo.tbEstat (


Ano smallint not null,
Mês tinyint not null,
AcumFem int not null default 0,
AcumMasc int not null default 0,
AcumNasc as (AcumFem + AcumMasc),
constraint I1_tbEstat primary key (Ano, Mês)
);

11
Importação de dados em massa no SQL Server

Como procedimento de gatilho é para atualizar estatísticas no caso de inclusões de linhas


na tabela tbCliente temos:

-- código #4.3
USE stageDB;
go

CREATE TRIGGER dbo.atu_tbEstat_INS


on dbo.tbCliente
after INSERT as
begin

-- se tabela virtual INSERT está vazia, então nada a processar


IF not exists (SELECT * from INSERTED)
return;

--
with acumINSERT as (
SELECT year(I.DataNasc) as Ano,
month(I.DataNasc) as Mês,
sum(case when Gênero = 'M' then 1 else 0 end) as QtdM,
sum(case when Gênero = 'F' then 1 else 0 end) as QtdF
from INSERTED as I
group by year(I.DataNasc), month(I.DataNasc)
)
MERGE dbo.tbEstat as E
using acumINSERT as I
on E.Ano = I.Ano and E.Mês = I.Mês
when matched then
UPDATE set AcumFem+= QtdF, AcumMasc+= QtdM
when not matched by target then
INSERT (Ano, Mês, AcumFem, AcumMasc)
values (I.Ano, I.Mês, I.QtdF, I.QtdM);
end;

Os procedimentos de gatilho para tratar atualizações (UPDATE) e remoções (DELETE) na


tabela tbCliente não constarão deste artigo, pois o contexto é exclusivamente de inclusão
de linhas na tabela de clientes.

IDENTITY_INSERT​: Como a coluna ChaveSub da tabela tbCliente possui a propriedade


IDENTITY, e para garantir que os valores incluídos nesta coluna sejam os mesmos que
constam no arquivo de importação, em alguns dos exemplos a seguir é necessário ativar
previamente a opção IDENTITY_INSERT, desativando-a ao final. Para detalhes sobre essa
opção consulte a documentação de “SET IDENTITY_INSERT” (vide item ​Documentação
SQL Server​, ao final).

TABLOCK​: Outro recurso utilizado em vários dos exemplos a seguir é o bloqueio da tabela
tbCliente através da opção TABLOCK, a qual especifica que bloqueio no nível de tabela é
adquirido durante a operação de importação em massa. Manter um bloqueio durante a

12
Importação de dados em massa no SQL Server

operação de importação em massa reduz a contenção de bloqueio na tabela e em alguns


casos pode melhorar significativamente o desempenho.

4.1. Provedores OLE DB


OLE DB, sigla de ​Object Linking and Embedding Database,​ fornece uma forma comum de
acessar informações independentemente do formato em que estejam armazenadas. A
informação a ser obtida pode estar armazenada em arquivos indexado-sequencial, bancos
de dados pessoais, planilhas eletrônicas, correio eletrônico, gerenciadores de banco de
dados etc., desde que exista o respectivo provedor OLE DB.
O provedor OLE DB é um componente de software que permite a um consumidor OLE DB
interagir com uma fonte de dados. Em alguns exemplos deste artigo será utilizado o
provedor OLE DB para Microsoft Jet. Detalhes de utilização deste provedor estão na
documentação de “OLE DB Provider for Microsoft Jet”, no item ​Documentação SQL Server​,
ao final.
A importação direta usando a função OPENROWSET em conjunto com provedor OLE DB
constitui uma consulta distribuída. Neste caso, é necessário previamente configurar a
instância SQL Server para permitir a execução de consultas distribuídas.

sp_configure 'show advanced options', 1;


RECONFIGURE;
go
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
go

Detalhes na documentação de “ad hoc distributed queries” (vide item ​Documentação SQL
Server​, ao final).

4.2. Arquivo texto com colunas de tamanho fixo


Para importar arquivos de texto podem ser utilizados vários dos métodos de importação
descritos anteriormente. Como demonstração para arquivos de texto com colunas de
tamanho fixo serão utilizados os métodos BULK INSERT, OPENROWSET e BCP.

A estrutura do arquivo texto a ser importado está definido no arquivo de formato


cliente_fixo.fmt​. As instruções para criação deste arquivo estão no capítulo “​Arquivo
de formato​”.

4.2.1. Usando BULK INSERT


O primeiro exemplo de importação de arquivo texto com colunas de tamanho fixo utiliza a
instrução BULK INSERT, descrita anteriormente no item 3.1.

13
Importação de dados em massa no SQL Server

-- código #4.4
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
set dateformat ymd;

BULK INSERT dbo.tbCliente


from 'C:\Downloads\cliente.txt'
with (formatfile='C:\Downloads\cliente_fixo.fmt',
codepage = 'ACP',
check_constraints, keepidentity, fire_triggers,
tablock, order (ChaveSub asc)
);

Dentre as opções definidas, a CHECK_CONSTRAINTS garante a integridade dos dados, ao


executar as restrições CHECK durante a importação. Se não tivesse sido definida, após a
importação a tabela dbo.tbCliente estaria marcada como não confiável.
Outra opção que foi definida é a KEEPIDENTITY. Neste exemplo é desejado que a coluna
ChaveSub da tabela tbCliente mantenha o mesmo valor que está no arquivo de texto
importado. Também foi definida a opção FIRE_TRIGGERS, para garantir que caso exista
algum procedimento de gatilho associado à tabela tbCliente, para tratamento de inclusão, o
mesmo seja acionado. Duas outras opções constam no código acima: TABLOCK e ORDER.
A cláusula ORDER informa que os dados no arquivo texto estão ordenados pela coluna
ChaveSub.
Aproveite e consulte a documentação da instrução BULK INSERT (vide item ​Documentação
SQL Server​, ao final) e pesquise quais outras opções poderiam ser utilizadas neste
exemplo.

4.2.2. Usando OPENROWSET


O segundo exemplo de importação de arquivo texto com colunas de tamanho fixo utiliza a
função OPENROWSET, descrita anteriormente no item 3.2.

-- código #4.5
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

INSERT into dbo.tbCliente


with (keepidentity, tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, convert(date, T.[data], 120), T.sexo
from Openrowset (bulk 'C:\Downloads\cliente.txt',
formatfile='​C:\Downloads\cliente_fixo.fmt​',

14
Importação de dados em massa no SQL Server

codepage = 'ACP',
order (chave asc) unique
) as T;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”. O parâmetro ORDER informa que os dados no arquivo texto estão
ordenados pela coluna chave.

4.2.3. Usando BCP


O terceiro exemplo de importação de arquivo texto com colunas de tamanho fixo utiliza o
utilitário BCP, descrito anteriormente no item 3.3. O utilitário deve ser executado no prompt
do DOS.

-- código #4.6
rem remove conteúdo das tabelas
sqlcmd -Q "TRUNCATE TABLE stageDB.dbo.tbCliente; TRUNCATE TABLE
stageDB.dbo.tbEstat;"

rem executa a importação


BCP​ stageDB.dbo.tbCliente in "C:\Downloads\cliente.txt" -C
'ACP' -E -f "C:\Downloads\cliente_fixo.fmt" -h
"CHECK_CONSTRAINTS, FIRE_TRIGGERS, TABLOCK, ORDER (ChaveSub
asc)" -T

Observe que neste exemplo também é utilizado arquivo de formato; o mesmo do item 4.2.2.
Através de parâmetros foram definidas as opções:
● CHECK_CONSTRAINTS (declarada no parâmetro -h), que garante a integridade dos
dados ao executar as restrições CHECK durante a importação;
● FIRE_TRIGGERS (declarada no parâmetro -h), para caso exista algum
procedimento de gatilho associado à tabela tbCliente, para tratamento de inclusão, o
mesmo seja acionado;
● KEEPIDENTITY (parâmetro -E), para garantir que a coluna ChaveSub da tabela
tbCliente contenha o mesmo valor que está no arquivo de texto importado;
● TABLOCK, (declarada no parâmetro -h), para estabelecer o bloqueio da tabela
durante a importação em massa;
● ORDER, (declarada no parâmetro -h), informa que os dados no arquivo texto estão
ordenados pela coluna ​ChaveSub​.

4.3. Arquivo texto no formato CSV


Como exemplos de importação de arquivos de texto no formato CSV serão utilizados os
mesmos métodos demonstrados na importação de arquivo texto com colunas de tamanho
fixo.

15
Importação de dados em massa no SQL Server

A estrutura do arquivo texto a ser importado está definido no arquivo de formato


cliente_csv.fmt​. As instruções para criação deste arquivo estão no item “​Arquivo de
formato​”.

4.3.1. Usando BULK INSERT


O primeiro exemplo de importação de arquivo utiliza a instrução BULK INSERT, descrita
anteriormente no item 3.1.

-- código #4.7
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
set dateformat ymd;

BULK INSERT dbo.tbCliente


from 'C:\Downloads\cliente.csv'
with (fieldterminator = ',',
rowterminator = '\n',
codepage = 'ACP',
check_constraints, keepidentity, fire_triggers,
tablock
);

Neste caso não é necessário o uso de arquivo de formato, como ocorreu no exemplo de
importação de arquivo com colunas de tamanho fixo. Mas pode ser utilizado, não sendo
então definidos os parâmetros FIELDTERMINATOR e ROWTERMINATOR.

Dentre as opções definidas, a CHECK_CONSTRAINTS garante a integridade dos dados, ao


executar as restrições CHECK durante a importação. Se não tivesse sido definida, após a
importação a tabela dbo.tbCliente estaria marcada como ​não confiável.​
Outra opção que foi definida é a KEEPIDENTITY. Neste exemplo é desejado que a coluna
ChaveSub da tabela tbCliente mantenha o mesmo valor que está no arquivo de texto
importado. Também foi definida a opção FIRE_TRIGGERS, para garantir que caso exista
algum procedimento de gatilho associado à tabela tbCliente, para tratamento de inclusão, o
mesmo seja acionado. Consta também no código acima a opção TABLOCK.
Aproveite e consulte a documentação da instrução BULK INSERT (vide item ​Documentação
SQL Server​, ao final) e pesquise quais outras opções poderiam ser utilizadas neste
exemplo.

4.3.2. Usando OPENROWSET


O segundo exemplo de importação de arquivo texto no formato CSV utiliza a função
OPENROWSET, descrita anteriormente no item 3.2.

16
Importação de dados em massa no SQL Server

-- código #4.8
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

INSERT into dbo.tbCliente


with (keepidentity, tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, convert(date, T.[data], 120), T.sexo
from Openrowset (bulk 'C:\Downloads\cliente.csv',
formatfile='​C:\Downloads\cliente_csv.fmt​',
codepage = 'ACP'
) as T;

Para este exemplo é utilizado arquivo contendo definição do formato do arquivo de entrada.
As instruções para criação desse arquivo estão no capítulo “​Arquivo de formato​”.

4.3.3. Usando BCP


O terceiro exemplo de importação de arquivo texto com formato CSV utiliza o utilitário BCP,
descrito anteriormente no item 3.3. O utilitário deve ser executado no prompt do DOS.

-- código #4.9
rem remove conteúdo das tabelas
sqlcmd -Q "TRUNCATE TABLE stageDB.dbo.tbCliente; TRUNCATE TABLE
stageDB.dbo.tbEstat;"

rem executa a importação


BCP​ stageDB.dbo.tbCliente in "C:\Downloads\cliente.csv" -C
'ACP' -E -f "C:\Downloads\cliente_csv.fmt" -h
"CHECK_CONSTRAINTS, FIRE_TRIGGERS, TABLOCK" -T

Observe que neste exemplo também é utilizado arquivo de formato; o mesmo do item 4.2.2.
Através de parâmetros foram definidas as opções:
● CHECK_CONSTRAINTS (informada no parâmetro -h), que garante a integridade
dos dados ao executar as restrições CHECK durante a importação;
● FIRE_TRIGGERS (informada no parâmetro -h), para caso exista algum
procedimento de gatilho associado à tabela tbCliente, para tratamento de inclusão, o
mesmo seja acionado;
● KEEPIDENTITY (parâmetro -E), para garantir que a coluna ChaveSub da tabela
tbCliente contenha o mesmo valor que está no arquivo de texto importado;
● TABLOCK, (informada no parâmetro -h), para estabelecer o bloqueio da tabela
durante a importação em massa.

17
Importação de dados em massa no SQL Server

4.4. Arquivo texto no formato XML


Para importar arquivos texto no formato XML uma das formas é através da função
OPENXML, descrita anteriormente no item 3.7. O exemplo abaixo importa arquivo de texto
no formato XML do tipo attribute centric.

-- código #4.10
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

-- lê o arquivo XML como um objeto binário (blob)


declare @Cliente_xml xml;
set @Cliente_xml= (SELECT convert(xml, X.linha)
from Openrowset(BULK 'C:\Downloads\cliente.xml',
SINGLE_BLOB) as X(linha));

--
declare @hDoc int;
EXECUTE sp_xml_preparedocument @hDoc output, @Cliente_xml;
--
set IDENTITY_INSERT tbCliente on;

--
INSERT into dbo.tbCliente
with (tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, convert(date, T.[data], 120), T.sexo
from OpenXML (@hDoc, '/root/cliente', 0)
with (chave varchar(12),
nome varchar(50),
data varchar(10),
sexo char(1)) as T;

EXECUTE sp_xml_removedocument @hDoc;


set IDENTITY_INSERT tbCliente off;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”.
Caso o arquivo XML estivesse como ​element centric​, bastaria alterar o valor do terceiro
parâmetro da função OpenXML. Esta é uma das vantagens do uso dessa função sobre os
métodos query() e value(), não sendo necessário reprogramar o código da consulta.

18
Importação de dados em massa no SQL Server

4.5. Arquivo texto no formato JSON


Para importar arquivos texto no formato JSON uma das formas é através da função
OPENJSON, descrita anteriormente no item 3.8.

-- código #4.11
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

-- lê o arquivo JSON como um objeto binário (blob)


declare @Cliente_json varchar(max);
set @Cliente_json= (SELECT convert(varchar(max), J.linha)
from Openrowset(BULK 'C:\Downloads\cliente.json',
SINGLE_BLOB) as J(linha));

set IDENTITY_INSERT tbCliente on;

INSERT into dbo.tbCliente


with (tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, convert(date, T.[data], 120), T.sexo
from OpenJSON (@Cliente_json, '$.cliente')
with (chave varchar(12),
nome varchar(50),
data varchar(10),
sexo char(1)) as T;

set IDENTITY_INSERT tbCliente off;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”.

4.6. Planilha eletrônica


A importação de planilhas eletrônicas para tabela de banco de dados é algo frequente,
principalmente para quem trabalha com ETL. A importação direta utiliza provedor OLE DB,
que tanto pode ser utilizado na função OPENROWSET ou através de vinculação de
servidores.

4.6.1. Usando OPENROWSET


O provedor OLE DB a ser utilizado varia de acordo com a versão do arquivo Excel (xls ou
xlsx) e do SQL Server (32 ou 64 bits). Detalhes no documento “Excel Import to SQL Server
using Distributed Queries” (vide item ​Outras fontes de consulta​, ao final).

19
Importação de dados em massa no SQL Server

Para demonstração será utilizado arquivo no formato xls, em instância SQL Server 2008 de
32 bits. O provedor OLE DB utilizado é o Jet 4.0.

-- código #4.12
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

set IDENTITY_INSERT tbCliente on;

INSERT into dbo.tbCliente


with (tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, convert(date, T.[data], 102), T.sexo
from Openrowset('Microsoft.Jet.OLEDB.4.0',
'​Excel 8.0;Database=C:\Downloads\cliente.xls​',
[cliente$]) as T;

set IDENTITY_INSERT tbCliente off;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”.

4.6.2. Usando vinculação de servidores


É possível também simular uma vinculação de servidores para acessar diretamente o
conteúdo de planilhas Excel, utilizando provedor OLE DB. O provedor OLE DB a ser
utilizado varia de acordo com a versão do arquivo Excel (xls ou xlsx) e do SQL Server (32
ou 64 bits). Detalhes no documento “Excel Import to SQL Server using Linked Servers” (vide
item ​Outras fontes de consulta​, ao final).
Para demonstração será utilizado arquivo no formato xls, em instância SQL Server 2008 de
32 bits. O provedor OLE DB utilizado é o Jet 4.0.
A vinculação da planilha como se fosse um servidor remoto se faz através do procedimento
armazenado sp_addlinkedserver (vide item ​Documentação SQL Server​, ao final).

-- código #4.13
EXECUTE sp_addlinkedserver
@server = 'PlanilhaExcel',
@srvproduct = 'Excel',
@provider = 'Microsoft.Jet.OLEDB.4.0',
@datasrc = 'C:\Downloads\cliente.xls',
@provstr = 'Excel 8.0;IMEX=1;HDR=YES;';
go

20
Importação de dados em massa no SQL Server

Uma vez que a planilha esteja associada como servidor vinculado, a consulta à planilha se
faz como se fosse uma tabela:

-- código #4.14
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

set IDENTITY_INSERT tbCliente on;

INSERT into dbo.tbCliente


with (tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, convert(date, T.[data], 102), T.sexo
from PlanilhaExcel...[cliente$] as T;

set IDENTITY_INSERT tbCliente off;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”.

4.7. Banco de dados Access


A importação de banco de dados Access para tabela de banco de dados em SQL Server é
algo frequente, principalmente para quem trabalha com ETL. A importação direta utiliza
provedor OLE DB, que tanto pode ser utilizado na função OPENROWSET ou através de
vinculação de servidores.

4.7.1. Usando OPENROWSET


O provedor OLE DB a ser utilizado varia de acordo com a versão do arquivo Access (mdb
ou accdb) e do SQL Server (32 ou 64 bits). Para demonstração será utilizado arquivo no
formato mdb, em instância SQL Server 2008 de 32 bits. O provedor OLE DB utilizado é o
Jet 4.0.

-- código #4.15
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

set IDENTITY_INSERT tbCliente on;

INSERT into dbo.tbCliente


with (tablock)
(ChaveSub, Nome, DataNasc, Gênero)

21
Importação de dados em massa no SQL Server

SELECT T.chave, T.nome, cast(T.[data] as date), T.sexo


from Openrowset('Microsoft.Jet.OLEDB.4.0',
'​C:\Downloads\cliente.mdb​'; '​admin​';'', [cliente]) ​as​ T;

set IDENTITY_INSERT tbCliente off;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”.

4.7.2. Usando a vinculação de servidores


É possível estabelecer a vinculação de servidores para acessar diretamente o conteúdo de
banco de dados Access, utilizando provedor OLE DB.
O provedor OLE DB a ser utilizado varia de acordo com a versão do arquivo Access (mdb
ou accdb) e do SQL Server (32 ou 64 bits). Para demonstração será utilizado arquivo no
formato mdb, em instância SQL Server 2008 de 32 bits. O provedor OLE DB utilizado é o
Jet 4.0.
A vinculação do banco de dados Access se faz através do procedimento armazenado
sp_addlinkedserver (vide item ​Documentação SQL Server​, ao final).

-- código #4.16
EXECUTE sp_addlinkedserver
@server = 'AccessDB',
@srvproduct = 'Access',
@provider = 'Microsoft.Jet.OLEDB.4.0',
@datasrc = 'C:\Downloads\cliente.mdb';
go

Uma vez que o banco de dados esteja associada como servidor vinculado, a consulta à
tabela se faz diretamente:

-- código #4.17
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

set IDENTITY_INSERT tbCliente on;

INSERT into dbo.tbCliente


with (tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, cast(T.[data] as date), T.sexo
from AccessDB...cliente as T;

22
Importação de dados em massa no SQL Server

set IDENTITY_INSERT tbCliente off;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”.

4.8. Banco de dados dBase


Uma das formas de importação direta de arquivos DBF utiliza provedor OLE DB em
conjunto com a função OPENROWSET. Neste exemplo o provedor OLE DB utilizado é o Jet
4.0.

-- código #4.18
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go

set IDENTITY_INSERT tbCliente on;

INSERT into dbo.tbCliente


with (tablock)
(ChaveSub, Nome, DataNasc, Gênero)
SELECT T.chave, T.nome, cast(T.[data] as date), T.sexo
from Openrowset('Microsoft.Jet.OLEDB.4.0',
'dBase IV; HDR=NO; IMEX=2; database=C:\Downloads\',
[cliente]) as T;

set IDENTITY_INSERT tbCliente off;

A função de IDENTITY_INSERT e TABLOCK está explicada no início do capítulo


“Importação de dados”.

23
Importação de dados em massa no SQL Server

5. Arquivo de formato

5.1. Introdução aos arquivos de formato


O arquivo de formato fornece as informações necessárias para importar dados em massa
para uma instância do SQL Server, com duas linhas iniciais com informações gerais e
depois uma linha para cada coluna que faça parte do arquivo a ser importado. Em alguns
dos itens de importação de arquivo de texto foram utilizados arquivos de formato contendo a
descrição do arquivo texto a ser importado. Por exemplo, o conteúdo do arquivo de formato
cliente_csv.fmt, utilizado em alguns exemplos anteriores para importar arquivo texto no
formato CSV, é o seguinte:

10.0
4
1 SQLCHAR 0 0 "," 1 chave ""
2 SQLCHAR 0 0 "," 2 nome Latin1_General_CI_AS
3 SQLCHAR 0 0 "," 3 data ""
4 SQLCHAR 0 0 "\r\n" 4 sexo Latin1_General_CI_AS

O arquivo de formato acima foi gerado inicialmente pelo utilitário BCP usando o seguinte
comando

BCP stageDB.dbo.tbCliente format nul -c -f "cliente_csv.fmt" -t, -T

e a seguir modificado para conter 0 na coluna que indica o tamanho do campo e também
alteração no nome dos campos no arquivo de texto.
A primeira linha contém a versão do software BCP utilizado para gerar o arquivo de formato.
No caso, “10.0” significa BCP do SQL Server 2008. A segunda linha contém o número de
campos que estão descritos no arquivo de formato. No caso são 4 campos (chave, nome,
data e sexo).
As demais linhas contém, cada uma, a descrição de cada campo no arquivo de origem, em
8 colunas:
1. posição do campo
2. tipo de dados
3. tamanho do prefixo
4. tamanho do campo
5. separador de campo
6. posição de coluna correspondente na tabela do banco de dados
7. nome da coluna
8. agrupamento (​collation​) dos dados
A descrição detalhada do conteúdo de arquivo de formato está disponível em “Estrutura de
arquivos de formato não-XML” (vide item ​Documentação SQL Server​, ao final).

24
Importação de dados em massa no SQL Server

Já o conteúdo do arquivo de formato para a importação do arquivo texto com tamanho fixo
de colunas, cliente_fixo.fmt, é o seguinte:

10.0
4
1 SQLCHAR 0 6 "" 1 chave ""
2 SQLCHAR 0 50 "" 2 nome Latin1_General_CI_AS
3 SQLCHAR 0 10 "" 3 data ""
4 SQLCHAR 0 1 "\r\n" 4 sexo Latin1_General_CI_AS

A diferença está na coluna que informa o separador de campos e também no tamanho de


cada campo. Detalhes adicionais em “Criar um arquivo de formato” (vide item
Documentação SQL Server​, ao final).

5.2. Mapeamento entre campos e colunas


Nos exemplos deste artigo houve correspondência 1:1 entre o arquivo texto importado e a
tabela de destino. Isto é, mesmo número de colunas/campos além de colunas e campos na
mesma ordem. Entretanto, nem sempre isto ocorre, podendo citar algumas situações
divergentes entre a tabela no banco de dados e os campos no arquivo de dados a ser
importado; eis algumas:
1. a tabela contém mais colunas do que os campos existentes no arquivo de dados;
2. a tabela contém menos colunas do que os campos existentes no arquivo de dados;
3. a ordem das colunas na tabela não é a mesma dos campos no arquivo de dados.

5.2.1. Mais colunas do que campos


Um dos casos em que isso ocorre é quando a tabela possui coluna com valor preenchido
automaticamente quando cada linha é incluída na tabela. Por exemplo, informação do
momento (data e hora) em que a linha foi incluída.
Para exemplificar vamos criar uma variação da tabela tbCliente, agora com uma coluna
adicional contendo a data e hora de inclusão da linha no fuso horário UTC.

-- código #5.1
USE stageDB;
go
CREATE TABLE dbo.tbCliente2 (
ChaveSub int identity unique,
MomentoInclusão datetime2(0) default sysutcdatetime(),
Nome varchar(50) not null,
DataNasc date not null,
Gênero char(1) not null check (Gênero in ('M', 'F'))
);

25
Importação de dados em massa no SQL Server

A coluna MomentoInclusão, que é a segunda declarada na tabela, é preenchida


automaticamente. No arquivo de importação não há essa coluna e isto deve ser informado
através do novo arquivo de formato:

10.0
4
1 SQLCHAR 0 0 "," 1 chave ""
2 SQLCHAR 0 0 "," 3 nome Latin1_General_CI_AS
3 SQLCHAR 0 0 "," 4 data ""
4 SQLCHAR 0 0 "\r\n" 5 sexo Latin1_General_CI_AS

A diferença do arquivo de formato anterior está em negrito, com a especificação de que a


segunda coluna do arquivo de dados corresponde à terceira coluna da tabela; e assim em
diante.
Somente como exemplo de importação:

-- código #5.2
USE stageDB;
TRUNCATE TABLE dbo.tbCliente2;
go
set dateformat ymd;

BULK INSERT dbo.tbCliente2


from 'C:\Downloads\cliente.csv'
with (formatfile='C:\Downloads\cliente2_csv1.fmt',
codepage = 'ACP',
check_constraints, keepidentity,
tablock, order (ChaveSub asc)
);

5.2.2. Menos colunas do que campos


Pode ocorrer que o arquivo de dados contenha mais campos do que a tabela ou então de
que alguma coluna da tabela será suprida de outra forma, ignorando-se então o campo.
Para exemplificar, e complicar, vamos criar exemplo em que o campo chave é ignorado e o
conteúdo da coluna ChaveSub será gerado internamente (pois é uma coluna do tipo
identity). Para ignorar um campo basta informar 0 na sexta coluna, que indica a posição da
respectiva coluna na tabela. Observe bem os valores abaixo que estão em negrito.

10.0
4
1 SQLCHAR 0 0 "," 0 chave ""
2 SQLCHAR 0 0 "," 3 nome Latin1_General_CI_AS
3 SQLCHAR 0 0 "," 4 data ""
4 SQLCHAR 0 0 "\r\n" 5 sexo Latin1_General_CI_AS

26
Importação de dados em massa no SQL Server

O código de importação de exemplo será semelhante ao do código 5.2, somente


alterando-se o arquivo de formato e outra pequena mudança.

-- código #5.3
USE stageDB;
TRUNCATE TABLE dbo.tbCliente2;
go
set dateformat ymd;

BULK INSERT dbo.tbCliente2


from 'C:\Downloads\cliente.csv'
with (formatfile='C:\Downloads\cliente2_csv2.fmt',
codepage = 'ACP',
check_constraints,
tablock
);

Qual foi a “outra pequena mudança”?

5.2.3. Ordem diferente de colunas e campos


O terceiro caso de não equivalência é quando a ordem dos campos no arquivo de dados
não é o mesmo da ordem das colunas na tabela há equivalência 1:1 entre campos (no
arquivo de dados) e colunas (na tabela). Para quem já compreendeu os dois casos
anteriores, é ​mamão com açúcar.​
Antes teremos criar uma nova versão da tabela de clientes, agora com ordem de colunas
diferente.

-- código #5.4
USE stageDB;
go
CREATE TABLE dbo.tbCliente3 (
ChaveSub int identity unique,
Nome varchar(50) not null,
Gênero char(1) not null check (Gênero in ('M', 'F')),
DataNasc date not null
);

Para importar o arquivo texto de clientes, no formato CSV, temos que criar um novo arquivo
de formato, em que a ordem entre campos e colunas é estabelecida:

10.0
4
1 SQLCHAR 0 0 "," 1 chave ""
2 SQLCHAR 0 0 "," 2 nome Latin1_General_CI_AS
3 SQLCHAR 0 0 "," 4 data ""
4 SQLCHAR 0 0 "\r\n" 3 sexo Latin1_General_CI_AS

27
Importação de dados em massa no SQL Server

E então, alterar o nome do arquivo de formato, bem como o da tabela de destino no código
T-SQL de importação:

-- código #5.5
USE stageDB;
TRUNCATE TABLE dbo.tbCliente3;
go
set dateformat ymd;

BULK INSERT dbo.tbCliente3


from 'C:\Downloads\cliente.csv'
with (formatfile='C:\Downloads\cliente3_csv.fmt',
codepage = 'ACP',
check_constraints, keepidentity,
tablock, order (ChaveSub asc)
);

Alguma dúvida?

28
Importação de dados em massa no SQL Server

6. Referências

6.1. Documentação SQL Server


● ad hoc distributed queries
● BCP
● BULK INSERT
● Bulk Import of Data
● Criar um arquivo de formato
● Estrutura de arquivos de formato não-XML
● Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...)
● Importar dados do Excel para o SQL Server
● Importação em massa de dados
● Manter valores de identidade ao importar dados em massa
● OLE DB Programming Overview
● OLE DB Provider for Microsoft Jet
● OPENJSON
● OPENROWSET
● Pré-requisitos para minimal logging
● SET IDENTITY_INSERT
● sp_addlinkedserver
● The Data Loading Performance Guide

6.2. Outras fontes de consulta


Além das fontes de consulta descritas nos itens Referências e Documentação SQL Server,
outras fontes de consultas foram utilizadas, servindo de base para a construção deste
artigo.
● Dados Semi-estruturados
● Excel Import to SQL Server using Distributed Queries
● Excel Import to SQL Server using Linked Servers
● Minimal logging and Impact of the Batchsize in bulk load operations
● Comma-separated values
● Delimiter-separated values
● JSON
● OLE DB provider
● Transferring Data with JSON in SQL Server
● XML

29

Você também pode gostar