2

将数据直接从 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

有没有更简单、更快捷的方法来做到这一点?

4

4 回答 4

2

您可以创建一个数据源(使用链接服务器或) ,OPENROWSET然后只做一个:SELECTSQL Server

SELECT  *
INTO    mytable
FROM    OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]')

工作簿的路径Excel应该可以被SQL Server.

这是有关如何执行此操作的知识库文章。

于 2009-11-02T21:59:36.780 回答
1

通常我使用 SSIS 导入大型 Excel 文件。

于 2009-11-02T21:58:41.297 回答
1

使用导入 Excel 文件的解决方案

由于您对不强制用户保存文件有限制,并且大多数建议的解决方案都要求保存文件,所以我会使用 VBA

  • 在内存中创建工作簿对象
  • 将活动工作表中的粘贴复制到工作簿
  • SAVEAS工作簿到临时文件名 (TempExcelFile.xls) 和路径
  • 使用上面Quassnoi的方法导入SQL Server
  • 用零覆盖 TempExcelFile.xls
  • 删除 TempExcelFile.xls

这样,用户将不会被迫保存工作表,并且会提示他们保存它,就像他们在工作的自然过程中一样。

为了便于同时导入多个活动工作表,我将使用时间戳或 GUID 来创建文件名。


使用 ADO 查询的解决方案

让您的用户从内置 VBA 宏的模板创建他们的工作簿 确保保护工作簿以防止未经授权访问后面的宏/代码。

执行一个宏,它将遍历行和列,读取单元格值,构建 SQL 查询并执行它 - 使用带参数的存储过程来防止注入攻击。

于 2009-11-02T22:31:34.357 回答
0

您是否尝试过将 ActiveWorkBook.SaveAs("some temp filename") 放在顶部并从中导入?我用宏做了类似的事情,将 ActiveSheet 的内容通过 FTP 传输到远程服务器,它可以工作。

于 2009-11-02T22:01:30.043 回答