Tôi đang cố gắng nhập dữ liệu từ tệp Excel 2007 (.xlsx) vào SQL Server 2008 bằng cách sử dụng lệnh T-SQL OpenRowset() với "Microsoft.ACE. OLEDB.12.0 "Nhà cung cấp OLE DB và tôi nhận được lỗi" Không thể tìm thấy ISAM có thể cài đặt "liên tục. Tất cả phần cứng là 32-bit.Cách giải quyết "Không thể tìm thấy ISAM có thể cài đặt". lỗi cho nhà cung cấp OLE DB "Microsoft.ACE.OLEDB.12.0"
[Revised 1/10/12 để cố gắng tập trung mạnh hơn vào các bất thường]
sau Các câu lệnh T-SQL tạo ra lỗi:
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$]'
)
Nếu tôi lưu các tập tin Excel trong định dạng "Excel 97-2003" (.xls) và sử dụng nhà cung cấp Microsoft.Jet.OLEDB.4.0 cũ hơn để nhập dữ liệu, nó hoạt động tốt. Điều này khiến tôi nghĩ rằng đó không phải là vấn đề an ninh hay môi trường khác.
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES',
'SELECT * FROM [Sheet1$]'
)
Tuy nhiên, khi tôi cố gắng tập tin * .xls với nhà cung cấp Microsoft.ACE.OLEDB.12.0, mà phải phù hợp với các định dạng * .xls lạc hậu, lại một lần nữa thất bại với lỗi tương tự:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";',
'SELECT * FROM [Sheet1$]'
)
Ngoài ra, thú vị, khi tôi sử dụng thuật sĩ "Nhập dữ liệu ..." thuật sĩ SSMS, nó hoạt động tốt. Tôi đã lưu đầu ra của thuật sĩ Nhập dữ liệu dưới dạng gói SSIS và xem tệp SSIS để cố gắng tìm ra cách nó hoạt động và nó đã thành công khi sử dụng nhà cung cấp Microsoft.ACE.OLEDB.12.0. Đây là chuỗi kết nối từ các gói 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>
tôi cũng đã thực hiện cấu hình SQL Server có liên quan để cho phép OPENROWSET phân phối truy vấn:
sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO
Nếu tôi cũng đặt sau * sp_MSset_oledb_prop * giá trị (mà tôi tìm thấy trong một bài đăng ở đâu đó) ...
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
... sau đó thay đổi lỗi cho "lỗi Unspecified":
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)".
Tuy nhiên, tôi không chắc liệu đây có phải là lỗi ngược dòng hay hạ lưu hay không. (Có phải bây giờ đã tìm thấy "ISAM có thể cài đặt" nhưng không thành công?)
Tôi đã thử với nhiều tệp Excel trên hai máy/hệ điều hành khác nhau (Windows Server 2003, Windows XP SP3). Cả hai máy đều có 32 bit.
Tôi cũng đã thử cài đặt lại cả phiên bản Office 2007 và Office 2010 của AccessDatabaseEngine.exe (lần lượt là http://www.microsoft.com/download/en/details.aspx?id=23734 và http://www.microsoft.com/download/en/details.aspx?id=13255), không có kết quả.
Để tóm tắt:
- "Microsoft.Jet.OLEDB.4.0" nhà cung cấp công trình sử dụng T-SQL, nhưng "Microsoft.ACE.OLEDB.12.0" thì không.
- "Microsoft.ACE.OLEDB.12.0" hoạt động bằng trình hướng dẫn "Nhập dữ liệu ..." (theo như tôi có thể biết từ tệp công việc SSIS đã lưu).
- Đặt thuộc tính "AllowInProcess" và "DynamicParameters" thành "1" thay đổi lỗi thành "Lỗi không xác định". (Đó có phải là một bước tiến không ?!)
Mọi suy nghĩ?
Bạn đã tìm kiếm SO cho eeor này? Có rất nhiều câu hỏi hỏi về nó, hầu hết các câu trả lời dường như xoay quanh việc thêm dấu ngoặc kép quanh 'Dữ liệu nguồn = '...' ' –
Có, tôi đã dành vài giờ tìm kiếm SO và các nơi khác, và thử nhiều biến thể của chuỗi kết nối, bao gồm chơi với các dấu ngoặc kép, vì vậy tôi không nghĩ đó là vấn đề. (Điều đó bao gồm việc sao chép chuỗi kết nối SSIS đang hoạt động.) –
Tôi gặp vấn đề tương tự – Pete