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
右键点击这个文件夹,并给它读取执行代码的帐户(或组)的写入权限。 这解决了我的错误。
也
这是因为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文件夹上的所有用户授予写入权限…或用户组(首选)。