如何从一个表中获取大数据并在 VBA 中插入另一个表?
Posted
技术标签:
【中文标题】如何从一个表中获取大数据并在 VBA 中插入另一个表?【英文标题】:How to get bigdata from one table and insert into another in VBA? 【发布时间】:2018-08-27 09:19:55 【问题描述】:我有一个表格,其中包含关键、英语短语和其他 40 种语言的短语。见下图:
我想通过它的语言列打破这些表的记录,如下图:
我使用以下代码完成此操作:
Sub InsertIntoMasterPhrases()
Dim objRecordsetMaster As ADODB.Recordset
Set objRecordsetMaster = New ADODB.Recordset
Dim objRecordset As ADODB.Recordset
Set objRecordset = New ADODB.Recordset
objRecordsetMaster.ActiveConnection = CurrentProject.Connection
objRecordset.ActiveConnection = CurrentProject.Connection
objRecordsetMaster.Open ("SELECT [Master Table].* FROM [Master Table];")
While objRecordsetMaster.EOF = False
objRecordset.Open ("Select [SAP_LANGUAGE to LANG].[LANGUAGE NAME], [SAP_LANGUAGE to LANG].[LANGUAGE] " & _
"From [SAP_LANGUAGE to LANG]")
While objRecordset.EOF = False
key = objRecordsetMaster.Fields("Key").Value
englishPhrase = objRecordsetMaster.Fields("English Phrase").Value
language = objRecordset.Fields("LANGUAGE").Value
translation = objRecordsetMaster.Fields(languageName).Value
If (GetRecordsExist(CStr(key), CStr(englishPhrase), CStr(language)) = "") Then
Query = "INSERT INTO [Language Sample](Key,English,Translation,Language)VALUES ('" & key & "','" & englishPhrase & "','" & translation & "','" & language & "');"
CurrentDb.Execute Query
End If
objRecordset.MoveNext
Wend
objRecordset.Close
objRecordsetMaster.MoveNext
Wend
objRecordsetMaster.Close
End Sub
//Checking records already exist in table
Function GetRecordsExist(key As String, english As String, language As String) As String
Dim db As Database
Dim Lrs As DAO.Recordset
Dim LGST As String
Set db = CurrentDb()
Set Lrs = db.OpenRecordset("SELECT KEY FROM [Language Sample] where KEY='" & key & "' and English='" & english & "' and Language = '" & language & "'")
If Lrs.EOF = False Then
LGST = "Found"
Else
LGST = ""
End If
Lrs.Close
Set Lrs = Nothing
GetRecordsExist = LGST
End Function
在主表中,我有 15000 条记录,当它打破 15000 条记录时,它变成 15000 * 40 = 600000。上面的代码每分钟插入近 10000 条记录,几个小时后它挂断了。但它也不会产生任何错误,然后我必须重新启动访问。请帮助我如何以更好的方式做到这一点。
【问题讨论】:
【参考方案1】:备选方案 1:
使用大型 UNION 查询通过一条 SQL 语句追加许多记录,如下所述:
How to simulate UNPIVOT in Access 2010?
您可能希望将其分成几个块(例如,一次 5 或 10 种语言),否则 Access 可能会阻塞查询。
备选方案 2:
不要为每条记录运行 INSERT 语句,而是使用带有.AddNew
的 DAO 记录集。这在数量级上更快,请参阅此答案:
https://***.com/a/33025620/3820271
【讨论】:
我整天都在想这个。 unpivot 和 Addnew 的最佳答案以上是关于如何从一个表中获取大数据并在 VBA 中插入另一个表?的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个表中获取数据并插入到 EF Core 中所需的表中
如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?