Importar arquivo CSV no SQL Server para inserir registros em uma tabela

Como importar arquivo CSV no SQL Server

Neste tutorial mostro como importar um arquivo no formato CSV para uma tabela de um banco de dados SQL Server, de modo a realizar a inserção de múltiplos registros de uma só vez, por meio de uma operação INSERT INTO.

Para tal vamos usar dois arquivos: o arquivo CSV propriamente dito, contendo os dados a serem inseridos na tabela, e um arquivo especificador de formatos para ajustar os dados do arquivo CSV com as colunas específicas da tabela, além é claro do código SQL que executará a tarefa de inserção dos registros em bulk (vários de uma vez).

O que é um arquivo CSV?

Um arquivo CSV (Comma-Separated Values / Valores Separados por Vírgulas) é um tipo de arquivo de texto simples que armazena dados tabulares de forma estruturada, empregado com frequência para importar e exportar dados entre diferentes programas, sistemas e plataformas.

Neste tipo de arquivo, cada linha representa uma entrada de dados (um registro) e cada campo (coluna) é separado por um caractere delimitador, geralmente uma vírgula (“,”), ponto e vírgula (“;”) ou tabulação (“tab”). O mais comum é usar a vírgula, daí o nome do formato.

Cada linha no arquivo representa um registro e os campos podem conter texto, números, datas ou outros tipos de dados quaisquer. Usamos arquivos csv em aplicativos de planilhas, bancos de dados, programas para análise de dados e diversas outras aplicações, pois são bastante simples e fáceis de manipular.

Vamos usar neste tutorial um arquivo CSV de nome Livros.csv, que conterá dados a serem inseridos em uma tabela de nome Livro, e com ele vamos cadastrar vários registros de forma rápida e simples.

Arquivo CSV de exemplo: Livros.csv

A seguir temos o conteúdo do arquivo a ser usado no exemplo de inserção de linhas na tabela. Neste arquivo, a primeira linha é uma linha de cabeçalho, contendo os nomes das colunas da tabela que receberá os dados (tabela de nome Livro), separados por vírgulas. Você deve alterar o conteúdo desse arquivo de acordo com a tabela do banco que está usando, seguindo as instruções na sequência.

As linhas subsequentes contém os dados em si, sendo que cada linha do arquivo corresponde a uma linha a ser inserida na tabela (um registro), também separadas por vírgulas, seguindo a mesma ordem das colunas descritas no cabeçalho:

NomeLivro,ISBN13,DataPub,PreçoLivro,NumeroPaginas,IdEditora,IdAssunto
2001 - Um Odisséia no Espaço,9788576571551,20200930,55.86,336,3,1
Fahrenheit 451,9788525052247,20120601,43.56,216,3,1
Admirável mundo novo,9788525056009,20140101,50.32,312,3,1
1984,9788535914849,20090721,29.67,416,14,1
A volta ao mundo em 80 dias,9788537816134,18730101,59.41,256,11,5
O Nome da Rosa,9788501115829,20191216,51.99,592,18,5
Memórias Póstumas de Brás Cubas,9788525433131,18810101,34.90,240,14,6
O Evangelho Segundo Jesus Cristo,9788535905595,19910101,49.90,512,14,6
Cidades Invisíveis,9788535907445,19720101,42.80,176,14,6
Windows Server 2016: Installing & Configuring,9781535074094,20160712,432.00,436,4,11
Ensaio Sobre a Cegueira,9788571645118,19950101,39.90,312,14,6
Ulisses,9780141184432,19220202,78.90,450,16,6
Practical Electronics for Inventors,9781259587542,20160711,212.58,1056,9,3
Eu Robô,9788576571667,19501202,35.00,300,3,1
Dom Casmurro,9788525404186,19000101,19.90,256,14,6

Insira esse conteúdo em um arquivo de texto simples vazio, como um arquivo do bloco de notas no Windows, e salve com o nome de Livros.csv. Caso queira, acrescente mais livros à listagem. Não é necessário usar aspas para delimitar os dados do tipo VARCHAR ou DATE.

Obs.: Tome cuidado ao salvar o arquivo para não salvá-lo com a extensão .txt!!! Para evitar esse problema, selecione “Todos os arquivos” em “Tipo” na caixa de diálogo Salvar, e certifique-se de usar a codificação UTF-8, como segue:

Como salvar um arquivo no formato CSV no Bloco de Notas

A seguir criaremos o arquivo de formato XML a ser usado com esse csv.

Arquivo de Formato XML

Um arquivo de formato é um arquivo do tipo XML (eXtensible Markup Language) que descreve a estrutura dos dados contidos no arquivo CSV, especificando como os campos são delimitados, o comprimento máximo de cada campo e como esses campos são mapeados para as colunas da tabela do banco de dados durante o processo de importação de dados em massa..

O arquivo que usaremos possui o nome formato.xml. Crie-o com um editor de textos, usando o conteúdo a seguir, e salve-o no mesmo diretório do arquivo Livros.CSV:

<?xml version="1.0" encoding="UTF-8"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RECORD>
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100"/>
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="13"/>
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="8"/>
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="19"/>
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="10"/>
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="5"/>
    <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="5"/>
  </RECORD>
  <ROW>
    <COLUMN SOURCE="1" NAME="NomeLivro" xsi:type="SQLVARYCHAR"/>
    <COLUMN SOURCE="2" NAME="ISBN13" xsi:type="SQLVARYCHAR"/>
    <COLUMN SOURCE="3" NAME="DataPub" xsi:type="SQLDATE"/>
    <COLUMN SOURCE="4" NAME="PrecoLivro" xsi:type="SQLMONEY"/>
    <COLUMN SOURCE="5" NAME="NumeroPaginas" xsi:type="SQLSMALLINT"/>
    <COLUMN SOURCE="6" NAME="IdEditora" xsi:type="SQLSMALLINT"/>
    <COLUMN SOURCE="7" NAME="IdAssunto" xsi:type="SQLTINYINT"/>
  </ROW>
</BCPFORMAT>

O funcionamento deste arquivo é o seguinte:

  • <BCPFORMAT>: Elemento raiz do arquivo XML que define o formato do arquivo de dados.
  • <RECORD>: Define a estrutura de cada registro (linha) no arquivo CSV.
  • <FIELD>: Define os campos (colunas) do registro. Cada tag <FIELD> especifica o identificador do campo (ID), o tipo de terminador que separa os campos (TERMINATOR), e o comprimento máximo (MAX_LENGTH) do campo.
  • <ROW>: Define a correspondência entre os campos do arquivo CSV e as colunas da tabela do banco de dados.
  • <COLUMN>: Especifica como cada campo do arquivo CSV (SOURCE) é mapeado para uma coluna na tabela do banco de dados (NAME). Além disso, define o tipo de dados da coluna (xsi:type), que pode ser:
    • SQLVARYCHAR para strings
    • SQLDATE para datas
    • SQLMONEY para valores monetários
    • SQLSMALLINT para números inteiros pequenos
    • SQLTINYINT para números inteiros muito pequenos.

Código SQL

E a seguir temos o código SQL que deverá ser executado no SQL Server, por exemplo usando o SSMS (SQL Server Management Studio):

INSERT INTO Livro (NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto)
SELECT 
    NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto
FROM OPENROWSET(
    BULK 'C:\SQL\Livros.CSV',
    FORMATFILE = 'C:\SQL\Formato.xml',
CODEPAGE = '65001',  -- UTF-8
FIRSTROW = 2
) AS LivrosCSV;
O código opera da seguinte forma:

1. A linha “INSERT INTO Livro (NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto)” é a declaração SQL usada para inserir os dados na tabela Livro. Serão preenchidos os campos NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora e IdAssunto.

2. O comando “SELECT NomeLivro, ISBN13, DataPub, PrecoLivro, NumeroPaginas, IdEditora, IdAssunto” determina quais colunas do arquivo CSV serão selecionadas para inserção na tabela de livros.

3. “FROM OPENROWSET(BULK ‘C:\SQL\Livros.CSV’, FORMATFILE = ‘C:\SQL\Formato.xml’, CODEPAGE = ‘65001’, FIRSTROW = 2)“: Aqui, estamos usando a função OPENROWSET para abrir e ler o arquivo CSV especificado. Os parâmetros desta função são:

  • BULK ‘C:\SQL\Livros.CSV’: Indica o caminho do arquivo CSV que será lido (no caso o arquivo está na pasta SQL dentro da raiz do sistema).
  • FORMATFILE = ‘C:\SQL\Formato.xml‘: Especifica o arquivo de formato XML que descreve a estrutura do arquivo CSV. Este arquivo de formato é utilizado para especificar detalhes sobre o layout do arquivo CSV, como a ordem das colunas e o delimitador utilizado.
  • CODEPAGE = ‘65001’: Define a codificação de caracteres a ser usada durante a leitura do arquivo CSV. Neste caso, o valor 65001 representa a codificação UTF-8.
  • FIRSTROW = 2: Indica que a leitura do arquivo CSV começará a partir da segunda linha, de modo a ignorar o cabeçalho do arquivo CSV (que é a primeira linha).

4. AS LivrosCSV;: Define um alias (nome de correlação) para os dados extraídos do arquivo CSV, permitindo que esses dados sejam referenciados dentro da consulta como se fossem uma tabela temporária chamada LivrosCSV. É um parâmetro obrigatório aqui.

Execute o comando acima no SQL Server, e, se nenhum erro for retornado, verifique a inserção dos registros com um SELECT simples:

SELECT * FROM Livro;

Conclusão

Inserir alguns poucos registros em uma tabela de banco de dados é uma tarefa simples e rápida. Porém, cadastrar muitos registros – centenas, milhares ou até mesmo milhões – pode se tornar extremamente trabalhoso e demorado, e neste caso podemos recorrer à importação em massa dos dados. Neste tutorial vimos uma forma simples de fazer isso no SQL Server: usando arquivos de texto do tipo CSV.

Nos próximos tutoriais veremos outras formas de importação (e também exportação) de dados em bancos de dados.

Prefere assistir a uma aula? Então assista ao vídeo da Bóson Treinamentos no YouTube sobre Arquivos CSV no MySQL:

Colabore com a Bóson Treinamentos

Ajude o canal adquirindo meus cursos na Udemy:

Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: https://www.amazon.com.br/shop/bosontreinamentos

Sobre Fábio dos Reis (1206 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*