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.
*/
Tem algum comando para o Oracle SQL ? tentei estes mas não reconhece a sintaxe e comando. apresenta o erro:
BEGIN sys.sp_MSset_oledb_prop ‘Microsoft.ACE.OLEDB.12.0’, ‘DynamicParameters’, 1; END;
Relatório de erros –
ORA-06550: linha 1, coluna 31:
PLS-00103: Encontrado o símbolo “Microsoft.ACE.OLEDB.12.0” quando um dos seguintes símbolos era esperado:
:= . ( @ % ;
O símbolo “(” foi substituído por “Microsoft.ACE.OLEDB.12.0” para continuar.
ORA-06550: linha 1, coluna 81:
PLS-00103: Encontrado o símbolo “;” quando um dos seguintes símbolos era esperado:
) , * & = – + at in é mod lembrete not rem =>
ou != ou ~= >= <= e ou como like2
like4 likec entre || multiset m
06550. 00000 – “line %s, column %s:\n%s”
*Cause: Usually a PL/SQL compilation error.
No curso administração avançada para DBAs integramos oracle com SQL, mas não possuo vídeos no youtube/blog detalhando isso. Bons estudos 💪
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
Opa, boa tarde! Aqui tenho um post explicando como importar e exportar csv https://dba-pro.com/como-importar-e-exportar-arquivos-csv-no-sql-server/
Josué
é possivel utilizar esse método para importar tabelas entre 2 SQL servers para um DW usando match?
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.