将Excel 2010导入Sql Server 2008

时间:2013-04-24 10:31:03

标签: sql excel

我正在使用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数据库引擎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$]');

但它又没有用。

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

感谢。

1 个答案:

答案 0 :(得分:0)

回复:7303错误

Distributed Queries in SQL Server, data from 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 \网络服务\应用程序数据\本地\温度

对于本地系统帐户,其\ 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-unspecified-error.aspx

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

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

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

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

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

TEMP = C:\ DOCUME〜1个\管理员\ LOCALS〜1 \温度 TMP = C:\ DOCUME〜1名\管理员\ LOCALS〜1个\温度

这些是为%TEMP%和%TMP%设置的环境变量,因此转到该文件夹​​并右键单击并选择属性 - &gt;安全, 然后添加用户,在这种情况下是User / User,请注意用户的默认值是Read&amp; Execute / List Folder Content / Read,这还不够,你必须选择Write。

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

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

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

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