sql >> Base de Datos >  >> RDS >> Sqlserver

Excel de 32 bits y servidor SQL de 64 bits

¿Qué podría ser más simple que obtener datos de una tabla de Excel en SQL Server?

Hay muchas maneras de llevar a cabo esta tarea. Puede utilizar Servicios de integración (antes DTS) o importación y exportación asistente, que es lo mismo bajo el capó. Otra forma es crear una simple aplicación ADO.NET . Puede usar el servidor vinculado mecanismo, que le permite ver cualquier objeto accesible por ODBC/OLE DB en forma de tabla (una colección de tablas) o el resultado de una consulta ad hoc.

Había sido hasta que la arquitectura de 64 bits dejó de ser algo de gama alta y llegó a los portátiles de desarrolladores y usuarios. Es poco probable que un usuario típico instale un servidor de base de datos, mientras que es normal que un desarrollador tenga un servidor SQL de 64 bits en una máquina de 64 bits con MS Office de 32 bits. Sin embargo, en este caso, usar Excel o Access con servidores vinculados a SQL Server puede ser un desafío porque los controladores son de 32 bits. No hay proveedores disponibles para MS Office, aunque tengo uno instalado en mi PC.

Por lo tanto, un intento de utilizar Excel o Access con servidores vinculados a SQL Server, como se describe en la documentación, generará el siguiente error:

Mensaje 7302, Nivel 16, Estado 1, Línea 1

No se puede crear una instancia del proveedor OLE DB «Microsoft.ACE.OLEDB.12.0» para el servidor vinculado...

Entonces, ¿qué hacer?

Instale el proveedor de 64 bits, que está disponible para descargar en Microsoft Access Database Engine 2010 Redistributable. Obtenemos el siguiente error durante el proceso de instalación:

Si Office de 32 bits no estuviera instalado en la computadora, no recibiría esta advertencia.

¿Debo elegir entre la versión de 64 o 32 bits de MS Office y la versión de 64 o 32 bits de SQL Server? Desinstalar una versión e instalar otra no es una solución flexible. Además, no siempre es posible. Echemos un vistazo a la pregunta que una persona ha planteado en MSDN:

La base de datos de MS Access es un entorno de producción en el sitio del cliente y no es una opción para mí desinstalarla e instalar una versión de 64 bits. Tampoco es una opción desinstalar el SQL Server de 64 bits existente e instalar la versión de 32 bits, por supuesto. Una instalación adicional de un servidor SQL de 32 bits, proporcionando solo el enlace a MS Access sería la única opción entonces. Encuentro esto bastante horrible.

No entiendo esta parte.

Dado que no hay Jet de 64 bits, debe descargar e instalar la versión de 64 bits de «Microsoft Access Database Engine 2010 Redistributable». Gracias por tu respuesta, pero cuando instalo AccessDatabaseEngine_X64.exe me sale el siguiente error (imagen 1) Consulte este artículo de KB: support.microsoft.com/kb/2269468 El artículo en el vínculo de su último mensaje le indica que desinstale todos los productos de Office de 32 bits. Eso no tiene sentido para mí, porque el objetivo es conectarse a la base de datos de MS Access de 32 bits... Debe instalar la versión de 64 bits de "Microsoft ACE OLEDB Provider" para conectarse a un archivo de Access (32 bits o 64 bits) desde SQL Server. Pero traté de instalar el controlador de 64 bits, pero me da un error de instalación... El artículo anterior de KB explica la causa y brinda la solución, puede consultarlo. Me estás guiando en círculos.

Bueno, el problema es hacer que la versión de 64 bits de Microsoft ACE OLEDB Provider funcione con Office de 32 bits. Por qué no es posible hacer esto directamente es una gran pregunta. Hay mucha información sobre este tema:

El hecho de que no puedan hacerlo nos obliga a compilar dos versiones diferentes de nuestra aplicación; uno específicamente para la plataforma x86 y otro para la plataforma x64. Luego, debemos determinar de alguna manera qué versión del controlador ACE está instalada para saber qué versión (32 o 64 bits) de nuestra aplicación instalar. La vida sería mucho más sencilla si pudiéramos compilar nuestra aplicación para la AnyCPU predeterminada y luego se permitiera instalar proveedores de datos de 32 y 64 bits... ¿Por qué no pueden coexistir ACE de 32 y 64 bits? Se basa en el hecho de que Microsoft no admite la instalación en paralelo de Microsoft Office 2010 de 32 y 64 bits o sus componentes dependientes... Lo siento, pero esa no es una respuesta muy útil a la pregunta. P:¿Por qué las versiones de 32 y 64 bits de Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe y AccessDatabaseEngine_X64.exe) no se pueden instalar en la misma máquina? R:Microsoft no admite la instalación en paralelo de Microsoft Office 2010 de 32 y 64 bits. Eso no es una respuesta, es simplemente repetir la pregunta en otras palabras. P:¿Por qué no puedo hacer esto? R:Porque no lo apoyamos. P:¿Por qué no puedes apoyarlo? R:Porque no lo apoyamos.

Como solución alternativa, utilicé AccessDatabaseEngine_X64.exe con la clave pasiva que permite que la versión de 64 bits del proveedor coexista con la versión de Office de 32 bits. Cabe señalar que Microsoft no admite oficialmente este método. Además, hay advertencias sobre posibles problemas de compatibilidad.

Cuando instalé el controlador AccessDatabaseEngine_x64.exe ... MS Office Pro Plus inicia un proceso de configuración de MS que puede demorar uno o dos minutos antes de que se abra un documento o programa de Office . Si Office 2010 de 32 bits está instalado y si Ace de 64 bits está instalado con /passive , **cada** vez que ejecuta Access 2010, obtiene una rutina de instalación automática que se restablece a los controladores de 32 bits para Office .

En mi caso (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1), no hubo problemas visibles (toco madera). Aún así, me gustaría agregar que es tal cual y sin ninguna responsabilidad.

Descargue AccessDatabaseEngine_x64.exe, cree un punto de restauración del sistema (parece que se crea automáticamente al actualizar los componentes de Office) y ejecútelo desde la línea de comandos. Aquí están las posibles claves:

A diferencia de la imagen 2, la instalación se ejecuta

Luego, haga clic en Actualizar en el menú contextual de Proveedores:

Creé un archivo xslx simple muy rápidamente:

En SQL Server, cree un servidor vinculado en este Excel:

if exists (select 1 from sys.servers where name = 'XlsLnkSrv') exec sp_dropserver 
@server = 'XlsLnkSrv', @droplogins = 'droplogins'

exec sp_addlinkedserver @server = 'XlsLnkSrv', @srvproduct = 'ACE 12.0', 
@provider = 'Microsoft.ACE.OLEDB.12.0', @datasrc = 'C:\Temp\Sample.xlsx', 
@provstr = 'Excel 12.0; HDR=Yes'

Guión 1

Leer:

select * from openquery (XlsLnkSrv, 'Select * from [Sheet1$]')

Guión 2

¿Es exitoso? ¡No!

Mensaje 7399, nivel 16, estado 1, línea 1
El proveedor OLE DB «Microsoft.ACE.OLEDB.12.0» para el servidor vinculado «XlsLnkSrv» informó un error. El proveedor no proporcionó ninguna información sobre el error.
Mensaje 7303, nivel 16, estado 1, línea 1
No se puede inicializar el objeto de origen de datos del proveedor OLE DB «Microsoft.ACE.OLEDB.12.0» para servidor vinculado «XlsLnkSrv».

Aún así, ¡tiene éxito!

Asimismo,

select * from openrowset('Microsoft.ACE.OLEDB.12.0',  
'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Yes', 'Select * from [Sheet1$]')

Al principio, necesitamos hacer lo siguiente:

exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries', 1;
reconfigure

Guión 3

En conclusión, me gustaría señalar que el proveedor de 64 bits reemplazó al de 32 bits. Si creamos una conexión para Sample.xslsx en el flujo de datos del paquete DTS, obtendremos una falla de inicialización del proveedor OLE DB del motor de base de datos de Microsoft Office 12.0 Access, lo cual es lógicamente correcto, ya que devenv.exe es de 32 bits, mientras que el proveedor es de 64 bits. Para restaurar el comportamiento, es necesario restaurar el proveedor de Office de 32 bits (aquí). Sin embargo, en este caso, no podemos utilizar el servidor vinculado. Para hacer que el servidor vinculado funcione, vaya al principio del artículo.