0

我正在使用 Excel 2010 和 sql server 2008 将数据从 excel 导入到 sql server。但是我不成功。你能检查一下我在做什么吗?

sp_CONFIGURE 'show advanced options',1
RECONFIGURE
GO

sp_CONFIGURE 'optimize for ad hoc workloads',1
RECONFIGURE
GO

sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE


SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=C:\Users\anayak\AppData\Roaming\Microsoft\Templates\Book1.xlsx; HDR=YES;IMEX=1','SELECT * FROM [sheet1$]');

我在哪里得到这个错误

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)".

我为 Microsoft.ACE.OLEDB.12.0 安装了 Microsoft Access Database Engine 2010 Redistributable。

但是当我使用命令“ODBCAD32.EXE”来检查我的 excel 版本时,我得到了 14.00.4760.1000。

然后我尝试了我的连接字符串 -

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.14.0','Excel 14.0;Database=C:\Users\anayak\AppData\Roaming\Microsoft\Templates\Book1.xlsx; HDR=YES;IMEX=1','SELECT * FROM [sheet1$]');

但它又没用。

你能建议我在这里做错什么吗?

谢谢。

4

1 回答 1

0

回复:7303 错误

SQL Server 中的分布式查询,来自 XLS 的数据

所以你的主要错误可能是这个;

OLE DB provider "MICROSOFT.JET.OLEDB.4.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.JET.OLEDB.4.0" for linked server "(null)".

我会检查一些权限。

检查 Temp 文件夹的权限

这是必需的,因为提供程序在检索数据时使用临时文件夹。根据您使用的是本地系统帐户还是网络域帐户,该文件夹可以是以下之一。

对于网络帐户,文件夹是

\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp

对于本地系统帐户,它的 \Windows\ServiceProfiles\LocalService\AppData\Local\Temp

右键单击此文件夹并为其授予对执行代码的帐户(或组)的读写访问权限。这为我解决了错误。

http://blogs.msdn.com/b/spike/archive/2008/07/23/ole-db-provider-microsoft-jet-oledb-4-0-for-linked-server-null-returned-message-未指定的错误.aspx

这是因为 SQL Server 服务正在尝试将临时 DSN 写入启动服务的登录名的临时文件夹,在本例中为 Admin/Admin 登录名。临时文件夹类似于:C:\Documents and Settings\Admin\Local Settings\Temp .15 如前所述,OleDbProvider 将始终在初始化它的用户的上下文中执行,在本例中为用户/用户。.16 用户/用户对此文件夹没有任何权限(C:\Documents and Settings\Admin\Local Settings\Temp)。如果在执行 SQL 时运行 FileMon,我们可以看到以下内容:(实际上,尝试使用Process Monitor - http://technet.microsoft.com/en-us/sysinternals/bb896645

sqlservr.exe:000 查询信息 C:\DOCUME~1\Admini~1\LOCALS~1\Temp ACCESS DENIED 属性:错误

到目前为止总结一下:SQL Server 服务以管理员/管理员身份启动,当进行选择时,用户/用户调用 OleDb 提供程序。现在 OleDb 提供程序尝试在 temp 目录中创建一个临时 DSN。这将是 SQL Server 服务 (Admin/Admin) 的临时目录,但用户(在本例中为用户/用户)没有此文件夹的写入权限。并且发生错误。

有两种方法可以解决这个问题。

选项 1:退出机器并以启动 SQL Server 服务的帐户(在本例中为 Admin/Admin)登录,然后启动命令提示符并键入“set t”(不带引号),这将显示如下内容:

TEMP=C:\DOCUME~1\Admin\LOCALS~1\Temp TMP=C:\DOCUME~1\Admin\LOCALS~1\Temp

这些是为 %TEMP% 和 %TMP% 设置的环境变量,因此转到该文件夹​​并右键单击并选择 Properties -> Security,然后添加用户,在本例中为 User/User,注意用户的默认设置是Read&Execute/List Folder Content/Read,这还不够,你还得选择Write。

注销,然后以用户/用户身份再次登录,然后从 SSMS 重新运行命令。这次应该可以了。

选项 2:以管理员身份登录并将 TEMP 和 TMP 变量更改为,例如 C:\Temp,基本上这会将 Temp 目录移出 Documents and Settings 文件夹。但是,您必须重新启动 SQL 服务器才能使其生效。

所以基本上,当 SQL Server 启动时,它使用启动帐户 (Admin/Admin) 的 Temp 文件夹,但 MICROSOFT.JET.OLEDB.4.0 将始终以调用 SQL 命令的用户 (User/User ),除非该用户对该临时文件夹没有写入权限,否则这将失败。

在不知道所有设置的情况下,也许选项 2 是首选解决方案,因为使用选项 1,您将必须添加将调用提供程序的所有用户,这可能不切实际。此外,在更改 SQL Server 服务的启动帐户时,将使用该帐户的 TEMP 目录,并且您将再次看到错误,直到您再次为此 TEMP 文件夹上的所有用户授予写入权限...或用户组(首选)。

于 2014-08-12T15:23:09.827 回答