Consultar un fichero de Excel desde SQL Server

Hola a todos,
Muchas veces necesitamos realizar carga de datos en una BBDD desde ficheros externos, o bien solamente consultar datos, y a menudo puede ser desde ficheros de Office o similares. Vamos a ver cómo consultar un fichero de Excel desde SQL Server como ejemplo, utilizando un script de Transact-SQL.

Para realizar la lectura de datos desde un fichero debemos utilizar en nuestro código la función OPENROWSET, cuya sintaxis completa se puede revisar aquí.

Función OPENROWSET

Esta función es la encargada de acceder al contenido del fichero.La sintaxis básica del comando es la siguiente:

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

Hay que especificar que tipo de fichero es, si es de Excel, Access, etc y versión del driver que vamos a usar. Además hay que especificar la ruta del fichero.

Esta función se utiliza en una query que se puede ejecutar en el código de nuestro procedure, o si se quiere recuperar un conjunto de datos se puede utilizar en la query del cursor

El ejemplo de código que se va a utilizar es:

FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;Database=E:\prueba_excel\datos_excel.xlsx', [Hoja1$])

Esta es la explicación de cada uno de ellos:

  • Microsoft.ACE.OLEDB.12.0 –> Es el driver que se utiliza para acceder al fichero.
  • Excel 12.0 –> Versión de Excel del fichero que contiene los datos.
  • HDR=YES –> Especifica si la tabla de Excel de donde se recuperan los datos tiene cabeceras. Si se especifica NO y tiene cabeceras devuelve error.
  • Database=E:\prueba_excel\datos_excel.xlsx –> Ruta completa del fichero que va a ser origen de los datos.
  • [Hoja1$] –> Hoja del fichero origen de los datos.

Ejemplo de uso de OPENROWSET

En este caso hemos creado unos datos de prueba inventados, para mostrar el funcionamiento en un cursor.

Consultar un fichero de Excel desde SQL Server

El cursor se declara como un cursor normal de Transact-Sql de SQL Server declarando la query, especificando la función OPENROWSET en el momento de FROM.

Declare cursor_nombres Cursor For
    	SELECT nombre, apellidos, fecha_nacimiento, salario
    	FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;Database=E:\prueba_excel\datos_excel.xlsx', [Hoja1$])

Y luego el tratamiento es el mismo que cualquier cursor de Transact-SQL, hay que declarar las variables, abrir y recuperar del cursor con un bloque que recorra el cursor (WHILE por ejemplo) y posteriormente cerrar el cursor y liberar los recursos del mismo.

Con este cursor que hemos declarado , se podría escribir un bloque como este:

OPEN cursor_nombres
FETCH next From cursor_nombres Into @nombre,@apellidos,@fecha_nacimiento,@salario

    WHILE @@FETCH_STATUS = 0 -- Mientras haya datos
    BEGIN
		
		<Acciones a realizar con los datos recuperados por el cursor>

	    FETCH next From cursor_nombres Into @nombre,@apellidos,@fecha_nacimiento,@salario

    END

CLOSE cursor_nombres  
DEALLOCATE cursor_nombres

Veamos cómo consultar un fichero de Excel desde SQL Server

Una vez que hemos recuperado los datos y los vamos leyendo con el bloque del cursor, el tratamiento de los datos es el tratamiento normal de Transact-SQL.

Si por ejemplo queremos mostrar los datos por pantalla se puede usar el comando print con las variables declaradas que se van recuperando en el cursor.

print 'Persona: ' + convert(varchar(10),@contador)
print @nombre + ' ' + @apellidos + ' ' + convert(varchar(10),@fecha_nacimiento,103) + ' ' + convert(varchar(10),@salario) + '€'

set @contador = @contador + 1

El resultado es el siguiente:

Consultar un fichero de Excel desde SQL Server

Aunque se puede utilizar también para realizar un insert en una tabla (Tabla empleados creada para la prueba)

insert into empleados values (@nombre,@apellidos,@fecha_nacimiento,@salario);

El resultado es el siguiente:

Consultar un fichero de Excel desde SQL Server

Código utilizado para consultar un fichero de Excel desde SQL Server

El código completo que hemos utilizado para el ejemplo es:

BEGIN
	-- Variables del cursor
    Declare @nombre varchar(50)
	Declare @apellidos varchar(100)
    Declare @fecha_nacimiento date
    Declare @salario Numeric(12,2)
	-- Variable contador de iteraciones del cursor
	Declare @contador int = 1
    Declare cursor_nombres Cursor For
    	SELECT nombre, apellidos, fecha_nacimiento, salario
    	FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;Database=E:\prueba_excel\datos_excel.xlsx', [Hoja1$])

    OPEN cursor_nombres
    FETCH next From cursor_nombres Into @nombre,@apellidos,@fecha_nacimiento,@salario
    While @@FETCH_STATUS = 0
    BEGIN
		-- Opción imprimir por pantalla
		print 'Persona: ' + convert(varchar(10),@contador)
	    print @nombre + ' ' + @apellidos + ' ' + convert(varchar(10),@fecha_nacimiento,103) + ' ' + convert(varchar(10),@salario) + '€'
	    set @contador = @contador + 1
		-- Opción insertar las filas en una tabla Empleados
		insert into empleados values (@nombre,@apellidos,@fecha_nacimiento,@salario);
	    FETCH next From cursor_nombres Into @nombre,@apellidos,@fecha_nacimiento,@salario
    END
   	CLOSE cursor_nombres  
	DEALLOCATE cursor_nombres
END
GO
print 'Fin del proceso.'

Esperamos que os haya resultado de utilidad. No dudéis en poneros en contacto con nosotros en caso de necesitar ayuda en la gestión de vuestras bases de datos. Échale un vistazo a nuestros servicios de soporte y mantenimiento Sql Server.

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.

Sígue a GPS en LinkedIn

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *