Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从Excel中的活动工作表导入SQL Server的最快方法是什么?_Sql Server_Excel_Ado_Jet - Fatal编程技术网

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

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返回空字符串,代码失

直接从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结合使用的入门书,但还没有找到任何值得一读的东西。您有任何示例代码吗?谢谢