5

我想从 Excel 中导出 MSSQL SERVER 2008 中的数据,但我有错误

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" 
returned message "Bookmark is invalid.".

Msg 7343, Level 16, State 2, Line 1

The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" 
could not INSERT INTO table "[Microsoft.ACE.OLEDB.12.0]". 

它是我导出时的 excel 文件(文件以 97-2003 格式保存) 服务器上的 Excel 文件版本 97-2003

这是我的查询 SQL查询

请告诉我为什么我会出错?我需要做什么?

4

5 回答 5

9

经过多次与此问题的斗争,我找到了以下解决方案:

  1. 在 64 位服务器和机器上,您需要首先卸载所有 32 位 Microsoft Office 应用程序和实例(Access 2007 安装、Office 10 32 位等)。否则,您将无法安装新的 64 位 Microsoft Access Database Engine 2010 Redistributable 组件。是的,它令人头疼,但这是我发现为需要在 64 位机器上运行的 JET 引擎组件安装新替代品的唯一方法。
  2. 从 Microsoft 下载并安装新组件:http: //www.microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d &displaylang=en
    • 这将安装设置链接服务器、OPENROWSET excel 文件等所需的访问和其他引擎。
  3. 打开 SQL Server 并运行以下命令:

    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'Ad Hoc Distributed Queries', 1;
    GO
    RECONFIGURE;
    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
    
    • 这将设置访问和运行与组件相关的查询所需的参数。地址'空
  4. 现在,如果您正在运行 OPENROWSET 调用,则需要放弃使用旧 JET 参数进行的调用并使用新调用,如下所示:

    (*Example, importing an EXCEL file directly into SQL):
    DONT DO THIS….
    SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;HDR=YES;Database=c:\PATH_TO_YOUR_EXCEL_FILE.xls','select * from [sheet1$]')
    
    USE THIS INSTEAD…
    SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=c:\PATH_TO_YOUR_EXCEL_FILE.xls','select * from [sheet1$]')
    
    *At this point resolved two SQL issues and ran perfectly
    
  5. 现在是有趣的部分……..找到您所有的 Office 磁盘并将所需的 Office 和/或应用程序重新安装到机器上。您可以通过进入磁盘并进入 64 位文件夹并运行它来安装 64 位版本的 Office 10,但请注意,在某些情况下,某些第三方应用程序尚未与该版本的 Office 交互。
于 2013-05-08T11:23:48.660 回答
6

试试这个

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                       'Excel 8.0;Database=C:\Export.xls;', 
                       'SELECT id_sale FROM [ExportSheet$]')
SELECT id_sale
FROM dbo.Sale

或者

INSERT INTO OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\Export.xls;Extended Properties=EXCEL 8.0')...[ExportSheet$]
SELECT id_sale
FROM dbo.Sale
于 2012-12-15T11:26:59.957 回答
0

我安装了 Office 32 位版本并安装了 Sql server 2008 r2(64 位)。我尝试安装 64 位版本的 AccessDatabaseEngine 可再发行组件,但它不会让我这样做。然后我尝试安装 32 位版本,但随后 sql server 抱怨:

OLE DB provider 'Microsoft.ACE.OLEDB.12.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

所以后来我辞职到安装办公室 64 位。然后我注意到“Microsoft Sql server 2008 r2”启动菜单中的“导入和导出数据(32 位选项)”。所以我尝试了,它对我有用。

我一直在尝试通过右键单击“数据库->任务-导入数据..”来导入数据,这显然是打开了 64 位版本并让我很痛苦。

于 2015-02-23T13:13:21.260 回答
0

1- 如果您使用的是 32 位版本的 Windows,请安装 AccessDatabaseEngine_x64.exe 或 AccessDatabaseEngine.exe(需要重新启动)。

2- 如果您使用的是 SQL Management Studio,请以管理员身份运行 Management Studio。如果您不以管理员帐户运行它,则会出现此错误(无法为链接服务器“(null)”初始化 OLE DB 提供程序“MICROSOFT.ACE.OLEDB.12.0”的数据源对象。

3-运行此命令来配置您的数据库

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE with override;
GO

EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE with override;
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

4- 不要在 OPENROWSET 函数中使用 'select * from sheet1$'。试试这个代码。

select * from OPENROWSET('MICROSOFT.ACE.OLEDB.12.0', 'Excel 12.0;HDR=YES;DATABASE=D:\test.xlsx', sheet1$)

如果您仍然有(32 位)错误,请尝试重新启动您的 SQL 服务并检查您的 C:\Windows\Temp 并查看您是否有权访问此目录。

于 2015-04-23T03:54:41.830 回答
0

手动检查/设置以下注册表项(具体路径取决于您的 SQL 服务器版本):

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\Microsoft.ACE.OLEDB.12.0]
"AllowInProcess"=dword:00000001
"DynamicParameters"=dword:00000001

同时使用 Jet 4.0 和 ACE.OLEDB.12 似乎是个问题。

于 2016-02-15T14:57:19.337 回答