Integrações entre Excel e SQL Server fazem parte dos processos diários de milhares de empresas.

Não é por acaso que SQL tem sido a habilidade mais procurada em TI e engenharia em 2023, de acordo com pesquisas recentes do linkedin e FIAP (https://www.computerworld.com/article/3688109/most-in-demand-skills-for-2023-according-to-linkedin.html).

Nesse contexto, veremos como importar arquivos Excel no SQL com apenas 1 linha de comando, além de sincronizar uma tabela do SQL com base em arquivos Excel!

Assista ao vídeo de demonstração:

Script da aula


------------------------------------------------------------------
-- Como importar arquivos Excel no SQL com 1 linha de comando!
------------------------------------------------------------------

--------------------------------------------------
-- Requisitos
--------------------------------------------------
-- #1: Ativar "ad hoc distributed queries"
execute sys.sp_configure 'show advanced options', 1
reconfigure
execute sys.sp_configure 'ad hoc distributed queries', 1
reconfigure
go

-- #2: Ativar "Microsoft.ACE.OLEDB.12.0"
execute sys.sp_MSset_oledb_prop 'Microsoft.ACE.OLEDB.12.0', 'AllowInProcess', 1 
execute sys.sp_MSset_oledb_prop 'Microsoft.ACE.OLEDB.12.0', 'DynamicParameters', 1 
go

-- #3: Verificar se o usuário do SQL possui permissão na pasta onde está o arquivo. 


--------------------------------------------------
-- Lendo arquivos Excel
--------------------------------------------------
-- xls
select * from openrowset('Microsoft.ACE.OLEDB.12.0','Excel 8.0;hdr=yes;Database=c:\tmp\cotacoes.xls;', [cotacoes$]) as c
go

-- xlsx
select * from openrowset('Microsoft.ACE.OLEDB.12.0','Excel 12.0;hdr=yes;Database=c:\tmp\cotacoes.xlsx;', [cotacoes$]) as c
go

--------------------------------------------------
-- Sincronizando Excel & Tabela SQL
--------------------------------------------------
-- Base de testes
drop database if exists curso
go
create database curso
go
create table curso.dbo.cotacoes_mercado (nome varchar(100), cotacao money, unidade char(2))
go
insert into curso.dbo.cotacoes_mercado values 
	('Cebola', 2, 'kg'),
	('Berinjela', 3, 'kg'),
	('Abobrinha', 4, 'kg')
go


-- Merge de Excel & Tabela
merge curso.dbo.cotacoes_mercado as DESTINO
using openrowset('Microsoft.ACE.OLEDB.12.0','Excel 12.0;hdr=yes;Database=c:\tmp\cotacoes.xlsx;', [cotacoes$]) as ORIGEM on destino.nome = origem.produto
when matched then
	update set 
		destino.cotacao = origem.preco,
		destino.unidade = origem.unidade
when not matched by target then 
	insert (nome, cotacao, unidade) values (origem.produto, origem.preco, origem.unidade)
when not matched by source then
	delete
output 
	$action as Acao,
	coalesce(inserted.nome, deleted.nome),
	deleted.cotacao as preco_antigo,
	inserted.cotacao as preco_novo,
	coalesce(inserted.unidade, deleted.unidade);
go


-- Teste: Comparação de dados:
select * from openrowset('Microsoft.ACE.OLEDB.12.0','Excel 12.0;hdr=yes;Database=c:\tmp\cotacoes.xlsx;', [cotacoes$]) as c
select * from curso.dbo.cotacoes_mercado
go



--------------------------------------------------
-- DICAS DE TROUBLESHOOTING
--------------------------------------------------
/*
-- Caso ocorra erro "acesso negado" ou "não é possível iniciar linked server null":
Certifique que o nome do arquivo excel, colunas e nome da planilha estão corretos
Certifique que o usuário de serviço do SQL possui acesso na pasta do arquivo. Reinicie o serviço do SQL caso tenha alterado permissões.
Abra o SSMS como ADM.
	
*/

4 respostas

  1. Existe uma forma de ler um arquivo .csv que as colunas nao sao fixas para fazer um de para , exemplo ( arquivo 1 coluna 1 = telefone , coluna 2 = cpf outro usuario sobe agora um outro arquivo ( arquivo 2 coluna 1 = documento , coluna 2 = nome , coluna 3 = telefone ) sendo que preciso carregar estas colunas para fazer um de para importar certo

  2. Josué
    é possivel utilizar esse método para importar tabelas entre 2 SQL servers para um DW usando match?

    1. Olá, sim, você poderia conectar-se em ambos os bancos e transferir os dados usando como base o código apresentado. No entanto, entendo que esse papel seria melhor executado por alguma ferramenta mais robusta de ETL, como o SSIS.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *