Visualizações: 10.183 views
 
Tempo de Leitura:   5 minutosOlá pessoal,
Boa noite!
Nesse post, vou falar sobre um recurso muito interessante do SQL Server e que funciona como um grande diferencial do banco de dados, que é a capacidade de integrar nativamente, com o Excel, permitindo consultar e manipular planilhas através do banco de dados, sem precisar de nenhum outro recurso externo.
Para que isso seja possível, você precisa instalar os drivers OLEDB ACE ou JET para realizar a integração com o Excel. Para saber mais sobre isso, acesse o post SQL Server – Como instalar os drivers Microsoft.ACE.OLEDB.12.0 e Microsoft.Jet.OLEDB.4.0.
Planilha de exemplo que será usada neste post:


Importando dados do Excel para o Banco
Como Importar uma planilha do Excel para o SQL Server
A forma mais utilizada com certeza é a leitura de dados de uma planilha do Excel para o banco de dados SQL Server. Para isso, vamos utilizar o OPENROWSET e o driver ACE OLEDB 12.0, uma vez que meu sistema operacional e o meu banco estão na versão 64 bits e utilizando uma planilha do Office 2016 (O plugin JET suporta até a versão 2003).
O comando básico para a leitura é assim:
		
		
			
			
			
			
				
					
				|  | SELECT *  FROM OPENROWSET (     'Microsoft.ACE.OLEDB.12.0',      'Excel 12.0;Database=C:\Teste.xlsx;',      'SELECT * FROM [Aba1$]' ) | 
				
			 
		  
Exemplo:

Uma outra forma, que deixa essa integração bem mais fácil, é criar uma Stored Procedure para facilitar a utilização dos dados:
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | CREATE PROCEDURE [dbo].[stpImporta_Excel](     @Caminho VARCHAR(5000),      @Aba VARCHAR(200),      @Colunas VARCHAR(5000) ) AS BEGIN       DECLARE @Exec VARCHAR(MAX)       SET @Exec = 'SELECT * from OPENROWSET (''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;Database='         + @Caminho         + ';'',    ''SELECT '         + @Colunas         + ' FROM ['         + @Aba         + '$]'') A'       EXEC(@Exec)   END | 
				
			 
		  
E aí você pode utilizar assim:

Você pode retornar apenas colunas específicas também:

Ou importar o resultado para uma tabela do banco de dados:

 
Exportando dados do banco para o Excel
Como inserir/exportar dados do SQL Server para o Excel
De uma forma muito simples, também é possível inserir dados do nosso banco de dados para uma planilha do Excel. A sintaxe básica é a seguinte:
		
		
			
			
			
			
				
					
				|  | INSERT INTO  OPENROWSET (     'Microsoft.ACE.OLEDB.12.0',      'Excel 12.0;Database=C:\Teste.xlsx;',      'SELECT * FROM [Aba1$]' ) SELECT 'Paulo', 32, 2584.44 | 
				
			 
		  
Exemplo da inserção:

Exemplo da consulta comprovando que o registro foi inserido:

Inserindo a partir de uma tabela:

Mais uma vez, podemos utilizar uma Stored Procedure para facilitar as operações durante o dia a dia:
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | CREATE PROCEDURE [dbo].[stpInsere_em_Excel](     @Caminho VARCHAR(MAX),      @Aba varchar(200),      @Tabela varchar(200),      @Colunas varchar(MAX) ) AS BEGIN       IF (@Colunas = '*')     BEGIN              SELECT              @Colunas = isnull(nullif(@Colunas,'*') + ',','') + b.name         FROM              sysobjects a WITH(NOLOCK)             JOIN syscolumns b WITH(NOLOCK) ON a.id = b.id         WHERE              a.xtype = 'U'             AND a.name = @Tabela       END                    DECLARE @Exec VARCHAR(MAX)       SET @Exec = 'INSERT INTO OPENROWSET (''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;Database='         + @Caminho         + ';'',    ''SELECT '         + @Colunas         + ' FROM ['         + @Aba         + '$]'') '         + 'SELECT '         + @Colunas         + ' FROM '         + @Tabela       EXEC(@Exec)   END | 
				
			 
		 
Exemplo de utilização da procedure:

 
Atualizando dados do Excel pelo banco
Como atualizar dados de uma planilha do Excel pelo SQL Server
Assim como as outras operações, é possível também atualizar dados de uma planilha do Excel através do SQL Server. A sintaxe básica é essa:
		
		
			
			
			
			
				
					
				|  | UPDATE A SET A.Nome = 'Teste 1' FROM OPENROWSET (     'Microsoft.ACE.OLEDB.12.0',      'Excel 12.0;Database=C:\Teste.xlsx;',      'SELECT * FROM [Aba1$]' ) A WHERE A.Nome = 'Paulo' | 
				
			 
		  
Exemplo:

Exemplo com JOIN utilizando tabelas locais do banco de dados:

Stored Procedure para facilitar o dia a dia:
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | CREATE PROCEDURE [dbo].[stpAtualiza_em_Excel](     @Caminho varchar(max),      @Aba varchar(200),      @Tabela varchar(200),      @Colunas_Join varchar(max),      @Colunas_Update varchar(max) ) AS BEGIN              DECLARE          @join VARCHAR(MAX) ,         @update VARCHAR(MAX);         SELECT           @join = ISNULL(@join + ' and ', '') + 'a.' + LTRIM(RTRIM(s)) + ' = b.' + LTRIM(RTRIM(s))     FROM             dbo.fncQuebra_Texto(@Colunas_Join, ',') AS a;            SELECT           @update = ISNULL(@update + ',', '') + 'a.' + LTRIM(RTRIM(s)) + ' = b.' + LTRIM(RTRIM(s))     FROM             dbo.fncQuebra_Texto(@Colunas_Update, ',') AS a;               DECLARE @Exec VARCHAR(MAX)          SET @Exec = 'UPDATE A '         + 'SET '         + @update         + ' FROM OPENROWSET (''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;Database='         + @Caminho         + ';'',    ''Select * From ['         + @Aba         + '$]'') A'         + ' JOIN '         + @Tabela         + ' b'         + ' ON '         + @join       EXEC(@Exec)   END | 
				
			 
		 
Função fncQuebra_Texto necessária para utilizar a SP:
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | CREATE FUNCTION [dbo].[fncQuebra_Texto] (     @str NVARCHAR(4000) ,     @separator CHAR(1) ) RETURNS TABLE AS RETURN (     WITH tokens ( p, a, b )     AS (          SELECT   1, 1, CHARINDEX(@separator, @str)         UNION ALL         SELECT   p + 1, b + 1, CHARINDEX(@separator, @str, b + 1)         FROM     tokens         WHERE    b > 0     )     SELECT           p - 1 zeroBasedOccurance ,         SUBSTRING(@str, a, CASE WHEN b > 0 THEN b - a ELSE 4000 END) AS s     FROM             tokens ); | 
				
			 
		  
Utilização da SP:

 
Infelizmente, apagar dados de planilhas do Excel pelo SQL Server não é possível. Caso você tente, encontrará essa mensagem de erro:
OLE DB provider “Microsoft.ACE.OLEDB.12.0” for linked server “(null)” returned message “Deleting data in a linked table is not supported by this ISAM.”.
Msg 7345, Level 16, State 1, Line 1
É isso aí, pessoal!
Um abraço e obrigado pela visita.
sql server importar ler exportar atualizar dados de uma planilha do excel para o banco import read export data spreadsheet datasheet
sql server importar ler exportar atualizar dados de uma planilha do excel para o banco import read export data spreadsheet datasheet
																
					 
				
Boa Noite! Tenho uma base no Excel e trouxe ela para o SQL, porém como faço pra atualizar a tabela toda no SQL? Exemplo acrescentei mais uma linha no excel com mais informações e agora quero que traga no SQL.
TOP!!…Vou procurar aqui como fazer isso com arquivos CSV,
Obrigadi