直接从Excel中的活动工作表将数据导入SQL Server数据库的最快方法是什么?
我在循环遍历行和列,生成SQL字符串,打开ADODB.Connection并执行SQL方面取得了巨大成功。但是,对于大型数据集,该解决方案太慢了。
所以我用ADO测试Jet Provider。它肯定更快,但它需要保存工作簿,我不能要求用户在上传之前保存工作簿。
如果已保存工作簿,则以下代码有效,但如果从未保存过ActiveWorkbook,则ActiveWorkbook.Path将返回空字符串,但代码将失败。
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
有更简单,更快捷的方法吗?
答案 0 :(得分:2)
您可以创建数据源(使用链接服务器或OPENROWSET
)并在SELECT
方面执行SQL Server
:
SELECT *
INTO mytable
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]')
Excel
可以访问SQL Server
工作簿的路径。
以下是关于如何执行此操作的KB article。
答案 1 :(得分:1)
通常我使用SSIS导入大型Excel文件。
答案 2 :(得分:1)
使用导入Excel文件的解决方案
由于您没有强制用户保存文件,并且大多数建议的解决方案都要求保存文件,我会使用VBA
SAVEAS
工作簿到临时文件名(TempExcelFile.xls)和路径这样,用户就不会被迫保存工作表,并且会提示他们保存工作表,就像他们在自然工作过程中一样。
为了便于同时导入多个活动工作表,我将使用时间戳或GUID来创建文件名。
使用ADO查询的解决方案
让您的用户从内置VBA宏的模板创建工作簿确保保护工作簿以防止未经授权访问后面的宏/代码。
执行一个宏,它将循环遍历行和列,读取单元格值,构建SQL查询并执行它 - 使用带参数的存储过程来防止注入攻击。
答案 3 :(得分:0)
您是否尝试过将ActiveWorkBook.SaveAs(“某些临时文件名”)放在顶部,然后从中导入?我使用宏做类似的事情,将ActiveSheet的内容FTP到远程服务器,它可以工作。