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. */
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.