Hola, chicos,
¡Buenas noches!

En esta publicación, voy a hablar sobre una característica muy interesante de SQL Server que funciona como un diferenciador importante para la base de datos, que es la capacidad de integrarse de forma nativa con Excel, permitiéndole consultar y manipular hojas de cálculo a través de la base de datos, sin necesidad de ningún otro recurso externo.

Para que esto sea posible, debe instalar los controladores OLEDB ACE o JET para integrarlos con Excel. Para obtener más información sobre esto, visita la publicación. SQL Server: cómo instalar los controladores Microsoft.ACE.OLEDB.12.0 y Microsoft.Jet.OLEDB.4.0.

Hoja de cálculo de ejemplo que se utilizará en esta publicación:

SQL Server - How to import data from Excel datasheet to database - Example1
SQL Server: cómo importar datos de una hoja de datos de Excel a una base de datos - Ejemplo 1

SQL Server - How to import data from Excel datasheet to database - Example2
SQL Server: cómo importar datos de una hoja de datos de Excel a una base de datos - Ejemplo 2

Importar datos de Excel al Banco

Cómo importar una hoja de cálculo de Excel a SQL Server

Sin duda, la forma más utilizada es leer datos de una hoja de cálculo de Excel en la base de datos de SQL Server. Para ello usaremos OPENROWSET y el controlador ACE OLEDB 12.0, ya que mi sistema operativo y mi banco están en la versión de 64 bits y usando una hoja de cálculo de Office 2016 (El complemento JET admite hasta la versión 2003).

El comando básico para leer es el siguiente:

SELECT * 
FROM OPENROWSET (
    'Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;Database=C:\Teste.xlsx;', 
    'SELECT * FROM [Aba1$]'
)

Ejemplo:

SQL Server - How to import data from Excel datasheet to database - Import
SQL Server - Cómo importar datos de una hoja de datos de Excel a una base de datos - Importar

Otra forma, que facilita mucho esta integración, es crear un Procedimiento Almacenado para facilitar el uso de los datos:

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

Y luego puedes usarlo así:

SQL Server - How to import data from Excel datasheet to database - Import2
SQL Server - Cómo importar datos de una hoja de datos de Excel a una base de datos - Import2

También puede devolver solo columnas específicas:

SQL Server - How to import Excel spreadsheet to database4
SQL Server: cómo importar una hoja de cálculo de Excel a una base de datos4

O importe el resultado a una tabla de base de datos:

SQL Server - How to import data from Excel datasheet to database - Import3
SQL Server - Cómo importar datos de una hoja de datos de Excel a una base de datos - Import3

Exportar datos de base de datos a Excel

Cómo insertar/exportar datos de SQL Server a Excel

De una forma muy sencilla también es posible insertar datos de nuestra base de datos en una hoja de cálculo de Excel. La sintaxis básica es la siguiente:

INSERT INTO 
OPENROWSET (
    'Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;Database=C:\Teste.xlsx;', 
    'SELECT * FROM [Aba1$]'
)
SELECT 'Paulo', 32, 2584.44

Ejemplo de inserción:

SQL Server - How to insert export data from database to Excel spreadsheet
SQL Server: cómo insertar datos de exportación desde una base de datos a una hoja de cálculo de Excel

Ejemplo de consulta que demuestra que el registro fue insertado:

SQL Server - How to insert export data from database to Excel spreadsheet2
SQL Server: cómo insertar datos de exportación desde una base de datos a una hoja de cálculo de Excel2

Insertando desde una tabla:

SQL Server - How to insert export data from database to Excel spreadsheet3
SQL Server: cómo insertar datos de exportación desde una base de datos a una hoja de cálculo de Excel3

Una vez más, podemos utilizar un Procedimiento Almacenado para facilitar las operaciones del día a día:

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

Ejemplo de uso del procedimiento:

SQL Server - How to insert export data from database to Excel spreadsheet4
SQL Server: cómo insertar datos de exportación desde una base de datos a una hoja de cálculo de Excel4

Actualización de datos de Excel a través del banco.

Cómo actualizar datos de una hoja de cálculo de Excel usando SQL Server

Al igual que otras operaciones, también es posible actualizar datos de una hoja de cálculo de Excel a través de SQL Server. La sintaxis básica es esta:

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'

Ejemplo:

SQL Server - How to update data in Excel spreadsheet from database
SQL Server: cómo actualizar datos en una hoja de cálculo de Excel desde la base de datos

Ejemplo con JOIN usando tablas de bases de datos locales:

SQL Server - How to update data in Excel spreadsheet from database2
SQL Server: cómo actualizar datos en una hoja de cálculo de Excel desde la base de datos2

Procedimiento almacenado para facilitar la vida cotidiana:

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

Función fncQuebra_Texto requerida para usar SP:

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
);

Uso de SP:

SQL Server - How to update data in Excel spreadsheet from database3
SQL Server: cómo actualizar datos en una hoja de cálculo de Excel desde la base de datos3

Desafortunadamente, no es posible eliminar datos de hojas de cálculo de Excel a través de SQL Server. Si lo intentas, encontrarás este mensaje de error:

El proveedor OLE DB “Microsoft.ACE.OLEDB.12.0” para el servidor vinculado “(nulo)” devolvió el mensaje “Este ISAM no admite la eliminación de datos en una tabla vinculada”.
Mensaje 7345, Nivel 16, Estado 1, Línea 1

¡Eso es todo, amigos!
Un abrazo y gracias por visitarnos.

servidor sql importar leer exportar actualizar datos desde una hoja de cálculo de excel al banco importar leer exportar hoja de cálculo de datos hoja de datos

servidor sql importar leer exportar actualizar datos desde una hoja de cálculo de excel al banco importar leer exportar hoja de cálculo de datos hoja de datos