从Excel中的活动工作表导入SQL Server的最快方法是什么?

时间:2009-11-02 21:53:53

标签: sql-server excel ado jet

直接从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 个答案:

答案 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)和路径
  • 使用上面的Quassnoi方法导入SQL Server
  • 用零覆盖TempExcelFile.xls
  • 删除TempExcelFile.xls

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

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


使用ADO查询的解决方案

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

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

答案 3 :(得分:0)

您是否尝试过将ActiveWorkBook.SaveAs(“某些临时文件名”)放在顶部,然后从中导入?我使用宏做类似的事情,将ActiveSheet的内容FTP到远程服务器,它可以工作。