VBA 将数据从 Excel (O365) 插入 SQL DB

问题描述 投票:0回答:1

我需要尽快将数据从 Excel 电子表格插入到 SQL Server。我尝试了几种选择,并放弃了所有涉及循环和创建记录集的性能较差的选项。有一种方法理论上应该很快,但它也出奇地慢,我不明白为什么。

下面的代码可以将工作表 DATA 中的所有数据插入到我们的本地 SQL Server 表 tbl_sales 中。我测试了 10k 行 X 30 列,需要 15 分钟。最终输入应约为。 250k 行 :(

不幸的是,BULK INSERT 或其他 SQL 过程不是一个选项,因为我们无权访问服务器。我必须通过 VBA 来解决它。

目标表(tbl_sales)被截断,没有索引...

Sub Import_To_SQL()

    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
 
    nSQL = "INSERT INTO [odbc;driver={SQL Server};server=sss;uid=uuu;pwd=ppp;trusted_connection=yes;database=salesdb].dbo.tbl_sales SELECT * FROM [DATA$];"
        
    cnn.Execute nSQL, , adExecuteNoRecords
    cnn.Close
    
End Sub

我尝试创建记录集,然后通过

UpdateBatch
对数据库进行操作,但性能相当慢。

sql vba bulkinsert
1个回答
0
投票

对于大型数据集,使用 Excel 连接对每一行数据执行 INSERT INTO 语句效率非常低。您可以使用 CopyFromRecordset 方法执行更高效的批量插入,如下所示:

Sub Import_To_SQL()
    Dim cnn As Object
    Dim rs As Object
    Dim connString As String
    Dim sqlServerConnString As String
    Dim sqlQuery As String

    ' Excel connection
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"

    ' SQL Server connection
    sqlServerConnString = "Provider=SQLOLEDB;Data Source=sss;Initial Catalog=salesdb;User ID=uuu;Password=ppp;"
    Set rs = CreateObject("ADODB.Recordset")

    ' Open the recordset from the Excel worksheet
    rs.Open "SELECT * FROM [DATA$];", cnn, adOpenStatic, adLockReadOnly

    ' Establish the connection to SQL Server
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open sqlServerConnString

    ' Set up the SQL query
    sqlQuery = "INSERT INTO tbl_sales SELECT * FROM OPENROWSET('SQLOLEDB','" & sqlServerConnString & "', 'SELECT * FROM tbl_sales')"

    ' Execute the bulk insert
    cnn.Execute sqlQuery

    ' Close connections
    rs.Close
    cnn.Close
End Sub

这会直接从 rs.Open 行中的 Excel 工作表打开记录集,然后使用单独的连接字符串打开与 SQL Server 建立连接,然后在单个批量操作中将整个记录集复制到 SQL Server 中的目标表,然后终止操作。

如果 SQL 连接字符串和目标表与您所拥有的不同,请调整它们。

© www.soinside.com 2019 - 2024. All rights reserved.