Cómo resolver el error "No se pudo encontrar el ISAM instalable" para el proveedor OLE DB "Microsoft.ACE.OLEDB.12.0"

Estoy intentando importar datos de archivos Excel 2007 (.xlsx) a SQL Server 2008 usando un comando T-SQL OpenRowset () con el proveedor OLE DB "Microsoft.ACE.OLEDB.12.0", y obtengo un mensaje persistente Error "No se pudo encontrar el ISAM instalable". Todo el hardware es de 32 bits.

[Revisado el 10/01/12 para tratar de enfocarse más en las anomalías]

a siguiente instrucción T-SQL produce el error:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"',
    'SELECT * FROM [Sheet1$]'
)

Si guardo el archivo de Excel en el formato "Excel 97-2003" (.xls) y uso el proveedor anterior Microsoft.Jet.OLEDB.4.0 para importar los datos, funciona bien. Esto me hace pensar que no es un problema de seguridad u otro problema ambiental.

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES', 
    'SELECT * FROM [Sheet1$]'
)

Sin embargo, cuando pruebo el archivo * .xls con el proveedor Microsoft.ACE.OLEDB.12.0, que debería ser compatible con el formato * .xls, vuelve a fallar con el mismo error:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";', 
    'SELECT * FROM [Sheet1$]'
)

También, curiosamente, cuando uso el asistente SSMS "Importar datos ...", funciona bien. Guardé la salida del asistente Importar datos como un paquete SSIS y busqué en el archivo SSIS para tratar de averiguar cómo funciona, y ES exitosamente usando el proveedor Microsoft.ACE.OLEDB.12.0. Esta es la cadena de conexión del paquete SSIS:

<DTS:Property DTS:Name="ConnectionString">
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES";
</DTS:Property>

También hice la configuración relevante de SQL Server para permitir la consulta distribuida OPENROWSET:

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

Si también configuro los siguientes valores * sp_MSset_oledb_prop * (que encontré en una publicación en alguna parte) ...

USE [master] 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 
GO 

... entonces el error cambia a "Error no especificado":

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

Sin embargo, no estoy seguro de si se trata de un error aguas arriba o aguas abajo. (¿Ahora encuentra el "ISAM instalable" pero falla posteriormente?)

He intentado esto con varios archivos de Excel en dos máquinas / sistemas operativos diferentes (Windows Server 2003, Windows XP SP3). Ambas máquinas son de 32 bits.

También he intentado volver a instalar las versiones Office Access y Office 2010 de AccessDatabaseEngine.exe http: //www.microsoft.com/download/en/details.aspx? id = 23734 yhttp: //www.microsoft.com/download/en/details.aspx? id = 13255, respectivamente), en vano.

Para resumir

El proveedor "Microsoft.Jet.OLEDB.4.0" funciona con T-SQL, pero "Microsoft.ACE.OLEDB.12.0" no. "Microsoft.ACE.OLEDB.12.0" funciona con el asistente "Importar datos ..." (por lo que puedo deducir del archivo de trabajo SSIS guardado). Establecer las propiedades "AllowInProcess" y "DynamicParameters" en "1" cambia el error a "Error no especificado". (¡¿Eso es un paso adelante?!)

¿Alguna idea

Respuestas a la pregunta(18)

Su respuesta a la pregunta