我正在尝试从SQL Server数据库中的一系列表中收集特定数据,并使用VBA将它们组合在Access中的单个表中。
我使用一个使用多个UNION ALL语句组合所有数据的查询在Access中创建了一个记录集。我最初的方法是迭代记录集,例如:
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String
cnn.Open "Driver={SQL Server};Server=" + SQLServerNameStr + ";Database=" + DBNameStr + ";Trusted_Connection=Yes"
SQL = "SELECT A, B, C FROM TableA UNION ALL SELECT D, E, F FROM TableB UNION ALL ..." // etc., etc., etc.
rs.Open SQL, cnn, adOpenForwardOnly
While Not rs.EOF
CurrentDB().Execute ("INSERT INTO AccessTable VALUES ('" & rs("FieldA") & "', '" & rs("FieldB") & "', '" & rs("FieldC") &"')")
rs.MoveNext
Wend
这一切都有效,然而,大约20,000条记录的速度极慢。我确信有一种更好的方法...可能是通过将INSERT构建到主查询中,然而,当数据源与SQL Server的连接和当前的目标时,我无法理解如何执行此操作数据库中。
任何建议都将不胜感激。
答案 0 :(得分:1)
尝试使用DoCmd.TransferDatabase
*将数据从SQL Server视图传输到Access表中,该视图以您需要的方式查询数据。
DoCmd.TransferDatabase acImport, "ODBC Database", _
"Driver={SQL Server};Server=" & SQLServerNameStr & ";Database=" & DBNameStr & _
";Trusted_Connection=Yes", acTable, "SomeSqlServerView", "AccessTable"
希望传输数据库方法能够很好地管理插入并加快导入过程。
*更改了我的答案,因为批量更新不能与Access 2010一起用作数据目标。
答案 1 :(得分:0)
我还没有使用原生表,但我怀疑这个问题与一次插入一个表有关。
您可能希望尝试通过SQL执行插入并一次执行50行。
答案 2 :(得分:0)
为什么不尝试执行Insert查询而不是创建记录集?看到这个问题: How to insert "Entire" DAO recordset into a table with VBA