Sql server 从Excel中的活动工作表导入SQL Server的最快方法是什么?
直接从Excel中的活动工作表将数据导入SQL Server数据库的最快方法是什么 我已经取得了巨大的成功,只需在行和列之间循环,生成一个SQL字符串,打开一个ADODB.Connection并执行SQL。然而,这种解决方案对于大型数据集来说太慢了 因此,我正在使用ADO测试Jet提供程序。它肯定更快,但它需要保存工作簿,我不能要求用户在从工作簿上载之前保存工作簿 如果工作簿已保存,但从未保存过ActiveWorkbook,则以下代码有效ActiveWorkbook.Path返回空字符串,代码失败Sql server 从Excel中的活动工作表导入SQL Server的最快方法是什么?,sql-server,excel,ado,jet,Sql Server,Excel,Ado,Jet,直接从Excel中的活动工作表将数据导入SQL Server数据库的最快方法是什么 我已经取得了巨大的成功,只需在行和列之间循环,生成一个SQL字符串,打开一个ADODB.Connection并执行SQL。然而,这种解决方案对于大型数据集来说太慢了 因此,我正在使用ADO测试Jet提供程序。它肯定更快,但它需要保存工作簿,我不能要求用户在从工作簿上载之前保存工作簿 如果工作簿已保存,但从未保存过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
Sub-UploadViaJet()
Dim objADO作为新的ADODB.连接
作为字符串的Dim strSQL
暗淡的阴影和长的一样
Set objADO=New ADODB.Connection
Open“Provider=Microsoft.Jet.OLEDB.4.0;”_
“数据源=”&ActiveWorkbook.Path&_
“\”&ActiveWorkbook.Name&“;”&_
“扩展属性=Excel 8.0”
strSQL=“SELECT*进入[odbc;Driver={sqlserver};”和_
“服务器=;数据库=;”&_
“UID=;PWD=]”测试表“&_
“来自[”&ActiveSheet.Name&“$]”
执行strSQL、lngRecsAff、adExecuteNoRecords
端接头
有没有更简单、更快的方法呢?通常我使用SSI导入大型Excel文件。您可以创建一个数据源(使用链接服务器或
OPENROWSET
),只需在SQL server
端执行选择:
SELECT *
INTO mytable
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]')
SQL Server应能访问带有Excel
工作簿的路径
下面是一个关于如何执行此操作的示例。您是否尝试过将ActiveWorkBook.SaveAs(“某个临时文件名”)放在顶部,然后从中导入?我使用宏执行类似的操作,将ActiveSheet的内容通过FTP传输到远程服务器,它可以正常工作。使用导入Excel文件的解决方案
由于您对不强制用户保存文件有限制,并且大多数建议的解决方案都要求保存文件,因此我将使用VBA来
- 在内存中创建工作簿对象
- 将粘贴从活动工作表复制到工作簿
SAVEAS
将工作簿转换为临时文件名(TempExcelFile.xls)和路径
- 使用上面的Quassnoi方法导入SQL Server
- 用零覆盖TempExcelFile.xls
- 删除TempExcelFile.xls
这样,用户就不会被迫保存工作表,并且会像在正常工作过程中那样提示用户保存工作表
为了便于同时导入多个活动工作表,我将使用时间戳或GUID来创建文件名
使用ADO查询的解决方案
让用户使用内置VBA宏的模板创建工作簿。请确保保护工作簿,以防止未经授权访问宏/代码
执行一个宏,该宏将在行和列之间循环,读取单元格值,构建SQL查询并执行它-使用带有参数的存储过程来防止注入攻击。这要求首先将工作簿上载到服务器,对吗?SQL server应该可以访问它,也就是说,UNC
path也可以工作。但一般来说,是的,应该上传。是的,这确实需要保存文件。请参阅我的答案,了解可能的解决方案。为什么不使用Windows temp file API?这是一个好主意,只是问题指出不应提示用户保存文件。因此,将内容复制到另一个文件并使用Windows Temp file API将是我的选择。到目前为止,我一直在使用ADO分布式查询。它对我来说运行得很好,但我的数据量已经增长到运行很长时间的程度,有时甚至超过了计算机的内存容量。使用临时文件似乎是一个很好的解决方案,即使它需要管理临时文件。谢谢Raj!我用剖面仪测试了喷射法。事实证明Jet方法只使用了ADO.Command.Prepared和参数化查询。因此,我在代码中复制了查询结构,获得了与Jet相同的性能,但仍然可以访问过程loop.HLGEM,您能详细介绍一下SSI吗?我正在寻找一本有关将SSIS与Excel结合使用的入门书,但还没有找到任何值得一读的东西。您有任何示例代码吗?谢谢