从Excel中的活动工作表导入SQL Server最快的方法是什么?
什么是直接从Excel中的活动工作表导入数据到SQL Server数据库的最快方法?
我只是循环遍历行和列,生成一个SQLstring,打开一个ADODB.Connection并执行SQL。 然而,这个解决scheme对于大型数据集来说太慢了。
所以我正在用ADOtestingJet Provider。 这绝对是更快,但它需要保存工作簿,并且我不能要求用户在从上传工作簿之前保存工作簿。
如果工作簿已保存,但以下代码可用,但是如果ActiveWorkbook从未保存过,则ActiveWorkbook.Path返回空string,代码将失败。
Sub UploadViaJet() Dim objADO As New ADODB.Connection Dim strSQL As String Dim lngRecsAff As Long Set objADO = New ADODB.Connection objADO.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ActiveWorkbook.Path & _ "\" & ActiveWorkbook.Name & ";" & _ "Extended Properties=Excel 8.0" strSQL = "SELECT * INTO [odbc;Driver={SQL Server};" & _ "Server=<server>;Database=<database>;" & _ "UID=<UID>;PWD=<PWD>].test_table " & _ "FROM [" & ActiveSheet.Name & "$]" objADO.Execute strSQL, lngRecsAff, adExecuteNoRecords End Sub
有没有更简单快捷的方法来做到这一点?
解决scheme使用导入Excel文件
既然你有没有强制用户保存文件的限制,并且大多数build议的解决scheme要求保存文件,我会使用VBA
- 在内存中创build一个工作簿对象
- 从活动工作表复制粘贴到工作簿
-
SAVEAS
工作簿以临时文件名(TempExcelFile.xls)和path - 使用上面的Quassnoi的方法导入到SQL Server中
- 用零覆盖TempExcelFile.xls
- 删除TempExcelFile.xls
这样用户不会被迫保存工作表,并且会提示他们保存工作表,就像他们在工作过程中那样。
为了便于同时导入多个活动工作表,我将使用时间戳或GUID来创build文件名。
使用ADO查询的解决scheme
让用户从内置VBAmacros的模板中创build工作簿。确保您保护工作簿以防止未经授权访问后面的macros/代码。
执行一个将循环遍历行和列的macros,读取单元格值,构build一个SQL查询并执行它 – 使用带有参数的存储过程来防止注入攻击。
您可以创build一个数据源(使用链接服务器或OPENROWSET
),只需在SQL Server
端执行SELECT
操作即可:
SELECT * INTO mytable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]')
SQL Server
可以访问Excel
工作簿的path。
这是关于如何做到这一点的KB文章 。
通常我使用SSIS导入大型Excel文件。
你有没有尝试只是把一个ActiveWorkBook.SaveAs(“一些临时文件名”)在顶部,并从中导入? 我做了一些类似于macros的工作,将ActiveSheet的内容FTP到远程服务器,并且工作。