我正在使用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$]');
但它又没有用。
你能否在这里建议我做错了什么?
感谢。
答案 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
右键单击此文件夹,并为执行代码的帐户(或组)提供读写访问权限。这解决了我的错误。
另外
这是因为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文件夹上的所有用户授予写入权限...或用户组(首选)。