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

时间:2014-02-03 15:06:52

标签: excel sql-server-2008

我想在SQL Server 2008中创建一个显示Excel文件中包含的数据的视图。

我不想使用导入数据,因为这些数据已更新。

我发现了这个:http://support.microsoft.com/kb/321686/en

我做了这些命令来启用一些选项:

sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

但是当我尝试使用此查询读取Excel文件时:

SELECT * FROM INTO XLImport3 OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0', 'Data Source=C:\Documents and Settings\jconnor\Desktop\Test.xlsx') ... [Sheet1$]

我回来了(这是法语翻译):

  

链接服务器“(null)”的OLE DB提供程序“Microsoft.Jet.OLEDB.4.0”返回>消息“未指定的错误”。   Msg 7303,Level 16,State 1,Line 1   无法为>链接服务器“(null)”初始化对象数据源OLE DB提供程序“Microsoft.Jet.OLEDB.4.0”。

有人有任何线索吗?

提前谢谢

1 个答案:

答案 0 :(得分:2)

卡尔,

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

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文件夹上的所有用户授予写入权限...或用户组(首选)。