使用脚本将Excel工作表放入临时表中

Doo*_*ght 9 sql sql-server excel sql-server-2008

我试图将这个excel表格放到一个表格中,所以我可以对它应用select语句等,用它的信息更新表格.

SELECT * 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
          'Excel 8.0;Database=C:\PB.xlsx',
          'SELECT * FROM [Sheet1$]')
Run Code Online (Sandbox Code Playgroud)

我正在运行64位机器.不知道它是什么excel版本.

错误:

消息7399,级别16,状态1,行1 OLE DB提供程序"Microsoft.Jet.OLEDB.4.0"用于链接服务器"(null)"报告错误.提供商未提供有关错误的任何信息.消息7303,级别16,状态1,行1无法为链接服务器"(null)"初始化OLE DB提供程序"Microsoft.Jet.OLEDB.4.0"的数据源对象.

当我更改为Excel 12.0;

OLE DB提供程序"Microsoft.Jet.OLEDB.4.0"用于链接服务器"(null)"返回消息"找不到可安装的ISAM.".消息7303,级别16,状态1,行1无法为链接服务器"(null)"初始化OLE DB提供程序"Microsoft.Jet.OLEDB.4.0"的数据源对象.

Fre*_*ell 8

导致此错误的原因有5种.

  1. 喷气发动机必须安装在服务器上.在服务器上安装MS Office会对其进行排序.
  2. xls的路径是相对于服务器的,而不是您运行命令的工作站
  3. 运行SQL Server服务的帐户必须具有xls所在文件夹的写访问权限.一种可能的解决方案是将服务启动帐户(例如管理员)的temp =和tmp =环境变量更改为(例如)c:\ temp,然后对c:\ temp启用对每个人的完全控制

4 ...

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
Run Code Online (Sandbox Code Playgroud)

5 ....

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 0 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 0
GO 
Run Code Online (Sandbox Code Playgroud)

现在我不知道为什么会这样,特别是考虑到其他人都说他们应该设置为1.然而,对我来说,将它们设置为零,在SQL Server 2008R2 32bit和M $ Office 2007上做了以下SQL语句的技巧

Select * 
into [temp_table$]
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\temp\EXPENDITURE REPORT.xls;HDR=YES;IMEX=1',
'SELECT * FROM [EXPENDITURE SHEET$]')
Run Code Online (Sandbox Code Playgroud)

注意:我故意使用了一个示例,其中文件名和工作表名称都有空格来表明可以这样做.


Joa*_*eal 7

对于xlsx文件(Excel 2007-2010),您可以使用ACE oledb提供程序而不是JET

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0;HDR=YES;Database=C:\PB.xlsx',
    'SELECT * FROM [Sheet1$]');
Run Code Online (Sandbox Code Playgroud)