Próbuję zaimportować dane z plików Excel 2007 (.xlsx) do SQL Server 2008 za pomocą polecenia T-SQL OpenRowset() z "Microsoft.ACE. OLEDB.12.0 "Dostawca OLE DB, a otrzymuję komunikat" Nie można znaleźć instalowalnego ISAM ". Cały sprzęt jest 32-bitowy.Jak rozwiązać problem "Nie można znaleźć instalowalnego modułu ISAM". błąd dla dostawcy OLE DB "Microsoft.ACE.OLEDB.12.0"
[Revised 1/10/12 spróbować silniej koncentrować się na anomaliach]
Poniższe oświadczenie T-SQL generuje błąd:
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$]'
)
Gdybym zapisania pliku Excel w formacie "Excel 97-2003" (.xls) i użyj starszego dostawcy Microsoft.Jet.OLEDB.4.0 do importowania danych, działa dobrze. To sprawia, że myślę, że nie jest to kwestia bezpieczeństwa lub innego problemu środowiskowego.
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES',
'SELECT * FROM [Sheet1$]'
)
Jednak gdy próbuję plik * .xls z dostawcą Microsoft.ACE.OLEDB.12.0, który powinien być kompatybilny wstecz ze formacie * .xls, to znowu nie powiedzie się z powodu tego samego błędu:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";',
'SELECT * FROM [Sheet1$]'
)
Co ciekawe, kiedy używam kreatora SSMS "Import danych ...", działa dobrze. Zapisałem dane wyjściowe kreatora danych importu jako pakiet SSIS i zajrzałem do pliku SSIS, aby dowiedzieć się, jak to działa i pomyślnie korzysta z dostawcy Microsoft.ACE.OLEDB.12.0. Jest to ciąg połączenia z pakietu 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>
Ja również zrobić odpowiednią konfigurację SQL Server aby umożliwić OPENROWSET rozproszoną zapytanie:
sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO
Gdybym też ustawić następujące * sp_MSset_oledb_prop * wartości (które znalazłem w poście gdzieś) ...
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
... wtedy zmiany błędach „Nieokreślony błąd”:
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)".
Jednak nie jestem pewien, czy jest to błąd w górę lub w dół. (Czy obecnie znajduje się "instalowalny moduł ISAM", ale następnie nie działa?)
Próbowałem tego z wieloma plikami Excel na dwóch różnych komputerach/systemach operacyjnych (Windows Server 2003, Windows XP SP3). Obie maszyny są 32-bitowe.
Próbowałem również ponownie zainstalować zarówno wersję Office 2007 i Office 2010 w wersji AccessDatabaseEngine.exe (odpowiednio http://www.microsoft.com/download/en/details.aspx?id=23734 i http://www.microsoft.com/download/en/details.aspx?id=13255), bezskutecznie.
Podsumowując:
- "Microsoft.Jet.OLEDB.4.0" usługodawca działa za pomocą T-SQL, ale "Microsoft.ACE.OLEDB.12.0" nie.
- "Microsoft.ACE.OLEDB.12.0" działa za pomocą kreatora "Importuj dane ..." (o ile wiem z zapisanego pliku zadania SSIS).
- Ustawienie właściwości "AllowInProcess" i "DynamicParameters" na "1" zmienia błąd na "Nieokreślony błąd". (Czy to krok do przodu ?!)
Jakieś myśli?
Czy szukał więc dla tego eeor? Pyta się o to wiele pytań, większość odpowiedzi wydaje się obracać wokół dodawania cytatów do twojego 'Data Source = '...'' –
Tak, spędziłem kilka godzin szukając SO i gdzie indziej, i próbowałem wielu odmian ciągu połączenia, w tym grę z cytatami, więc nie sądzę, że to jest problem. (Obejmuje to kopiowanie działającego ciągu połączenia SSIS.) –
Mam ten sam problem. – Pete