我正在尝试运行以下语句:
INSERT INTO table SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; Database=//server/folder/file.xls; HDR=YES;', 'SELECT * FROM [Sheet1$]')
但是,我收到以下错误:
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine cannot open or write to the file '\\server\folder\file.xls'. It is already opened exclusively by another user, or you need permission to view and write its data.". 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)".
我在32位计算机上运行SQL Server 2005。最终执行的代码将来自IIS6 Web服务器上的c#代码。但是,当前我只是试图使其在SQL Server上运行。我已使用SQL Auth登录到SQL Server,但必须使用特定于共享驱动器(我们网络上的AD帐户)的Windows Auth访问该文件。为了允许,已将临时特权授予SQL Auth帐户OPENROWSET。
OPENROWSET
我试图添加UID=user;PASS=pswd到OPENROWSET下面的代码中:
UID=user;PASS=pswd
INSERT INTO table SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; Database=//server/folder/file.xls; HDR=YES; UID=user; PASS=pswd', 'SELECT * FROM [Sheet1$]')
这产生了相同的错误。我还CREDENTIAL使用用户ID设置了SQL ,并通过Windows Auth Active Directory帐户访问了该共享驱动器,但仍然存在错误。
CREDENTIAL
我考虑过使用代理,但这不是SQL Server代理作业。这是一个特别的电话。
我还使用具有共享权限的用户使用Windows Auth登录了SQL Server,并得到了相同的错误。
我对此进行了很多研究,但似乎找不到有效的答案。通过我的搜索,这似乎是很多人遇到的问题。任何帮助将不胜感激。我很困惑
我非常确定,当您使用OpenRowSet时,它是需要访问文件的SQL Server的Service用户。
而且由于您似乎正在尝试访问另一台服务器上的文件,所以如果SQL Server以本地系统或其他本地用户帐户的身份运行,则使其工作可能是一个挑战。
我已经通过更改SQL Server使其以AD用户身份运行(具有安全隐患),然后赋予该用户访问网络上文件的权限,或者放置了外部文件(在这种情况下为Excel)来解决此问题)和SQL Server在同一台计算机上。