繁体   English   中英

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

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

我正在尝试寻找一种在不使用 OLEDB 的情况下将 excel 数据导入临时表的方法,因为我没有在 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,我会得到下面提到的错误。

OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”尚未注册。

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

使用表变量的超级mcguyver方式。 使用Excel工作表上的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 Server计算机上安装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()函数处理数据中的单引号,否则可能会破坏SQL语法。 然后,您只需将生成的文本复制并粘贴到SQL窗口中,然后运行它。

它的工作量很大,但可行

我假设您对 prod db 具有只读访问权限,可以创建临时表并插入临时表语句。 无法访问 sql 向导或任何提升的权限。

下面 4 个步骤,我们必须在我们的开发 sql 框中进行预成型。 然后生成 create #temptable 脚本和自动生成的插入语句并在生产临时数据库中运行它们

  1. 将 excel 作为 csv 文件保存到开发机器
  2. 创建一个#temptable/ ##temptable(因为通常开发人员在生产数据库中没有创建表的权限) 注意:如果表有更多列,请使用向导生成自动创建表语句。 如何? 答案是:右键单击数据库 --> 任务 --> 导入数据 --> sql 服务器导入和导出向导,select 数据源作为平面文件源并浏览您在步骤中创建的 csv 文件。 --> Next --> on the choose a destination select destination as sql server native client 11.0 --> next --> on select source table and views screen choose edit mappings --> on column mappings screen click edit sql button which gives自动生成的创建表语句。

复制自动生成的脚本 --> 将名称编辑为 ##TempTable_CSV --> 创建临时表。

  1. 现在桌子准备好了。 对于数据,通过提供 csv 路径 BULK INSERT ##TempTable_CSV FROM 'C:\Users<username>\Downloads\temp.csv' WITH (FIRSTROW = 2, FORMAT = 'CSV') 使用批量插入;

  2. 从临时表自动生成插入语句(例如假设临时表有 id、varchar 列) select 'insert ##TempTable_CSV values ('+Cast(Id as varchar(5))+','''+SomeVarcharColumn+ ''') 来自 ##TempTable_CSV

这将生成所有插入语句注意:确保处理 null 值

最后,您可以复制步骤 2 中的创建临时表脚本 + 步骤 4 中自动生成的插入语句,在 prod temp db 中运行它。

享受:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM