在 SQL 服务器中不使用 OLEDB 将 Excel 数据导入临时 Table

Import Excel Data Into Temporary Table Without Using OLEDB in SQL Server

我正在寻找一种不使用 OLEDB 将 excel 数据导入临时 table 的方法,因为我没有在 SQL 服务器中安装 OLEDB,我可以由于安全限制而不安装它。 我知道下面提到的方法,但这对我没有帮助

Begin Tran
If OBJECT_ID('tempdb..#tblUserImport') IS NOT NULL
Begin
Drop table #tblUserImport
end
Create Table [dbo].[#tblUserImport]
(
id nvarchar(max) NULL,
Name nvarchar(max) NULL,
Job_Title nvarchar(max) NULL,
Work_Email nvarchar(max) NULL
)
INSERT  INTO [dbo].[#tblUserImport]
SELECT  id, Name, Job Title, Work Email
FROM
OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=YES;Database=C:\Users\Desktop\Book2.xlsx', 'SELECT * FROM [Sheet1$]');
select * from [#tblUserImport]
Rollback Tran

如果我执行 openrowset,我会得到下面提到的错误。

The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.

是否可以使用存储过程或任何其他方式实现它?

super mcguyver 方式使用 table 变量。在 excel sheet 上使用 concat 函数为插入部分准备数据。

declare @temp1 table (id int identity(1,1),name varchar(255),job_title varchar(255),work_title varchar(255),work_email varchar(255));
insert into @temp1 (name,job_title,work_title,work_email)
values
('John','Electrician','level 3 lightning wizard','john@ex.com'),
('amy','Java Developer','Cyber Coffee Slinger','amy@ex.com');

这里有 3 个选项:

1.从您拥有管理员权限的计算机进行导入

听起来您无法在 SQL 服务器计算机上安装 OLE 或 ODBC 数据提供程序。但是您不必 运行 从同一台机器导入。只要您拥有有效的凭据和 SQL 服务器的有效网络路径,您就可以 运行 从任何计算机导入。因此,您可以在另一台 PC 上安装 Microsoft ACE OLEDB 12.0 数据提供程序驱动程序以及 SQL Server Management Studio,将 Excel 文件复制到那里,然后通过向导进行导入。

  1. 尝试备用数据提供程序驱动程序

您的环境中可能已经安装了 Excel 源的备用数据提供程序驱动程序。例如。 https://www.connectionstrings.com/excel/ 中提到的 Jet OLEDB 4.0 驱动程序。连接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;
Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
  1. 使用 Excel 公式构建 INSERT 语句

您可以使用 RBell 的回答中提到的古老的 Excel 公式技巧:假设您在问题中指定的字段在 A1 到 D1 中,将此公式添加到单元格 E1:

="INSERT INTO #tblUserImport VALUES ('"&SUBSTITUTE(A1, "'", "''")&"', '"&SUBSTITUTE(B1, "'", "''")&"', '"&SUBSTITUTE(C1, "'", "''")&"', '"&SUBSTITUTE(D1, "'", "''")&"');"

然后将此公式复制到所有数据行。 Excel 将自动更改每行的单元格引用。请注意,SUBSTITUTE() 函数处理数据中的 single-quotes,否则可能会破坏 SQL 语法。然后,您只需将生成的文本复制并粘贴到您的 SQL window 和 运行 中。