2012-08-23 35 views
9

Im tratando de obtener esta hoja de Excel en una tabla, para que pueda aplicar declaraciones de selección, etc., para actualizar las tablas con su información.Obtener la hoja de Excel en la tabla temporal utilizando una secuencia de comandos

SELECT * 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
      'Excel 8.0;Database=C:\PB.xlsx', 
      'SELECT * FROM [Sheet1$]') 

Im running 64 bit máquina. No tengo idea de qué versión de Excel es.

error:

Msg 7399, Level 16, State 1, Line 1 The OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)" reported an error. The provider did not give any information about the error. Msg 7303, Level 16, State 1, Line 1 Cannot initialize the data source object of OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)".

Cuando cambio a Excel 12.0;

OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)" returned message "Could not find installable ISAM.". Msg 7303, Level 16, State 1, Line 1 Cannot initialize the data source object of OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)".

+0

Cuando llegué estos errores me dijeron por nuestro DBA era porque este controlador necesita ser instalado en el servidor. ¿Está instalado en el tuyo? – Taryn

+0

@bluefeet Esta es actualmente mi computadora portátil, y no he instalado nada extra, así que si no está en 2008 R2. entonces No. – Doomsknight

+0

Hace algún tiempo tuve un error 7399 debido a incompatibilidad de controlador ODBC de 32/64 bits. Estaba tratando de leer datos de una hoja de cálculo de Excel a un SQL Server 2008 R2 de 64 bits. El controlador de Microsoft-Jet.OleDB es de 32 bits. Desafortunadamente no pude resolver el problema y tuve que instalar un servidor de 32 bits para leer los archivos de Excel. –

Respuesta

8

Hay 5 posibles causas de este error.

  1. El motor a reacción debe estar instalado en el servidor. La instalación de MS Office en el servidor lo resuelve.
  2. La ruta a xls es relativa al servidor, no a la estación de trabajo con la que ejecuta el comando
  3. La cuenta que ejecuta el servicio SQL Server debe tener acceso de escritura a la carpeta donde está el xls. Una posible solución es cambiar las variables de entorno temp = y tmp = de la cuenta de inicio del servicio (por ejemplo, Administrador) a (por ejemplo) c: \ temp, luego habilitar Control total en c: \ temp a Todos

4 ...

sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1; 
GO 
RECONFIGURE; 
GO 

5 ....

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 0 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 0 
GO 

Ahora no sé por qué esto funciona, sobre todo teniendo en cuenta que todo el mundo dice que se debe establecer en 1. para mí, sin embargo , poniéndolos a cero, hizo el truco para la siguiente estadística de SQL ement en SQL Server 2008R2 32 y M $ Oficina 2007

Select * 
into [temp_table$] 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=C:\temp\EXPENDITURE REPORT.xls;HDR=YES;IMEX=1', 
'SELECT * FROM [EXPENDITURE SHEET$]') 

Nota: A propósito ha usado un ejemplo en el que tanto el nombre de archivo y el nombre de la hoja tienen espacios para demostrar que esto se puede hacer.

+0

Solía Archivo csv al final, pero marcando esto como correcto debido a una buena respuesta detallada y de opciones múltiples. – Doomsknight

+1

Como se mencionó en la otra respuesta, puede intentar 'Microsoft.ACE.OLEDB.12.0', incluso con' Excel 8.0' –

+0

más 1 para el uso de los espacios en los nombres. –

7

Para los archivos XLSX (Excel 2007-2010) se puede utilizar el proveedor de ACE oledb en lugar del JET

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=YES;Database=C:\PB.xlsx', 
    'SELECT * FROM [Sheet1$]'); 
+0

me sale esta línea 'No se puede crear una instancia del proveedor OLE DB "Microsoft.ACE.OLEDB.12.0" para el servidor vinculado "(null)".' – Doomsknight

+0

se olvidó de mencionar que es necesario tener Office 2007+ instalado en el servidor o este componente: http://www.microsoft.com/en-us/download/details.aspx?id=23734 –

+0

Tengo oficina 2010 ...: | – Doomsknight

1

Sólo en caso de que alguien se topa con este años más tarde como yo, esto es lo que funcionó para mí:

Tuvimos una caja que tenía SQL Server Express 2012 en una máquina 8 de 64 bits de Windows con ninguna versión de Oficina instalada.

aquí es parte de mi configuración proc me almacenado:

INSERT INTO OPENROWSET ('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=R:\Export Membership Database\Member_Export.xls;', 
'SELECT * FROM [combined$]') 

(el resto de la instrucción SELECT debajo de este)

Recibí este error:

SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', search for 'Ad Hoc Distributed Queries' in SQL Server Books Online.

Hemos cambiado el configuración:

sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1; 
GO 
RECONFIGURE; 
GO 

ejecutó el procedimiento almacenado de nuevo y luego se produjo el error:

The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.

dimos cuenta de que teníamos que instalar este:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d&displaylang=en

Después de eso, trabajó como un encanto!

Cuestiones relacionadas