OLE DB提供程序“Microsoft.ACE.OLEDB.12.0”用于链接服务器“(null)”返回消息“Bookmark无效”。

时间:2012-12-15 00:20:31

标签: sql-server-2008 export-to-excel

我想从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 file version 97-2003 on server

我的查询 SQL QUERY

请告诉我,为什么我会收到错误?我需要做什么?

5 个答案:

答案 0 :(得分:9)

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

  1. 在64位服务器和盒子上,您需要首先卸载所有32位Microsoft Office应用程序和实例(Access 2007安装,Office 10 32位等)。如果您不这样做,则无法安装新的64位Microsoft Access数据库引擎2010可再发行组件。是的,这是一个令人头痛的问题,但我找到了为需要在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
    
    • 设置访问和运行与组件相关的查询所需的参数。地址'null
  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进行交互。

答案 1 :(得分:5)

试试这个

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

OR

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

答案 2 :(得分:0)

我安装了办公室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位版本并让我感到痛苦。

答案 3 :(得分:0)

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

2-如果您使用的是SQL Management Studio,请以管理员身份运行Management Studio。如果不以管理员帐户运行它,则会出现此错误(无法初始化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,看看是否可以访问此目录。

答案 4 :(得分:0)

检查/设置手动下面的注册表项(确切路径特定于您的SQL Server版本):

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

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