Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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.
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.
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
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.
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"/>
6
Importação de dados em massa no SQL Server
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.
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.
OPENROWSET ( 'provider_name' ,
{ 'datasource' ; 'user_id' ; 'password' | 'provider_string' } ,
{ [ catalog. ] [ schema. ] object | 'query' }
)
8
Importação de dados em massa no SQL Server
9
Importação de dados em massa no SQL Server
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
USE stageDB;
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;
11
Importação de dados em massa no SQL Server
-- código #4.3
USE stageDB;
go
--
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;
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
Detalhes na documentação de “ad hoc distributed queries” (vide item Documentação SQL
Server, ao final).
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;
-- código #4.5
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
14
Importação de dados em massa no SQL Server
codepage = 'ACP',
order (chave asc) unique
) as T;
-- código #4.6
rem remove conteúdo das tabelas
sqlcmd -Q "TRUNCATE TABLE stageDB.dbo.tbCliente; TRUNCATE TABLE
stageDB.dbo.tbEstat;"
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.
15
Importação de dados em massa no SQL Server
-- código #4.7
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
set dateformat ymd;
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.
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
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”.
-- código #4.9
rem remove conteúdo das tabelas
sqlcmd -Q "TRUNCATE TABLE stageDB.dbo.tbCliente; TRUNCATE TABLE
stageDB.dbo.tbEstat;"
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
-- código #4.10
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
--
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;
18
Importação de dados em massa no SQL Server
-- código #4.11
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
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
-- 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
-- código #4.15
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
21
Importação de dados em massa no SQL Server
-- 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
22
Importação de dados em massa no SQL Server
-- código #4.18
USE stageDB;
TRUNCATE TABLE dbo.tbCliente;
TRUNCATE TABLE dbo.tbEstat;
go
23
Importação de dados em massa no SQL Server
5. Arquivo de formato
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
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
-- 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
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
-- código #5.2
USE stageDB;
TRUNCATE TABLE dbo.tbCliente2;
go
set dateformat ymd;
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
-- código #5.3
USE stageDB;
TRUNCATE TABLE dbo.tbCliente2;
go
set dateformat ymd;
-- 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;
Alguma dúvida?
28
Importação de dados em massa no SQL Server
6. Referências
29