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

我想在SQL Server 2008中创build一个显示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”返回了“未指定的错误”消息。 消息7303,级别16,状态1,行1无法初始化对象数据源OLE DB提供程序“Microsoft.Jet.OLEDB.4.0”为链接的服务器“(空)”。

有人有任何线索吗?

先谢谢你

卡尔,

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

 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文件夹的权限

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

对于networking帐户,文件夹是

\的Windows \ ServiceProfiles \networking服务\应用程序数据\本地的\ 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-非指定error.aspx

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

sqlservr.exe:000 QUERY INFORMATION C:\ DOCUME〜1 \ Admini〜1 \ LOCALS〜1 \ Temp ACCESS DENIED属性:错误

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

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

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

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

这些是为%TEMP%和%TMP%设置的环境variables,因此转到该文件夹​​并右键单击并select“属性” – >“安全性”,然后添加用户,在此情况下为用户/用户,请注意用户的默认读取和执行/列出文件夹内容/读取,这是不够的,你也必须select写入。

注销,然后以用户/用户身份重新login并重新运行SSMS的命令。 这一次它应该工作。

选项2 :以pipe理员身份login并将TEMP和TMPvariables更改为(例如)C:\ Temp,基本上将Temp目录移出Documents and Settings文件夹。 但是,您必须重新启动SQL服务器才能生效。

所以基本上,当SQL Server启动时,它会使用启动帐户(Admin / Admin)的Temp文件夹,但MICROSOFT.JET.OLEDB.4.0将始终以调用SQL命令的用户身份执行(用户/用户),这将失败,除非该用户不具有对该临时文件夹的写访问权限。

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