【问题标题】:Importing data from SQL Server to Access 2010将数据从 SQL Server 导入 Access 2010
【发布时间】:2014-05-06 19:16:47
【问题描述】:

我正在尝试从 SQL Server 数据库中的一系列表中收集特定数据,并使用 VBA 将它们组合到 Access 中的单个表中。

我使用一个查询在 Access 中创建了一个记录集,该查询使用多个 UNION ALL 语句组合了所有数据。我最初的方法是使用以下内容遍历记录集:

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 和当前的目标时,我无法理解如何执行此操作数据库。

任何建议将不胜感激。

【问题讨论】:

  • 您的执行语句的 VBA 代码不正确,它是如何运行的?
  • 我试图简化......我并没有实际剪切和粘贴我的代码......我只是看看在没有编辑器更正我的语法的情况下尝试编码时犯了多少错误! !! ;)
  • 我已编辑问题以更正语法。

标签: sql sql-server vba ms-access-2010


【解决方案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 作为数据目标。

【讨论】:

  • dbOptimisitcBatch / dbUpdateBatch 仅支持 ODBCDirect 工作区...我可以用这种方式打开本机 Access 表吗?
  • 啊,你说得对,好像不支持批量更新。现在我正在考虑它,我正在从 VB6 应用程序写入 SQL Server。
【解决方案2】:

我没有太多使用原生表,但我怀疑这个问题与一次插入一个有关。

您可能想尝试通过 SQL 执行插入操作,一次执行 50 行左右。

【讨论】:

    【解决方案3】:

    为什么不尝试执行插入查询而不是创建记录集?看到这个问题: How to insert "Entire" DAO recordset into a table with VBA

    【讨论】:

    • 这是我希望做的,但我不知道如何将 SQL Server 连接上的 SELECT 查询包装在 CurrentDb() 上的 INSERT 查询中跨度>
    • INSERT INTO AccessTable (FieldA, FieldB, FieldC) SELECT (FieldA, FieldB, FieldC) FROM (SELECT A, B, C FROM TableA UNION ALL SELECT D, E, FROM TableB UNION ALL .. ." // 等等,等等,等等)
    • 也许我在想(这不会是第一次),但我将通过调用 CurrentDB().Execute 来运行查询,因此 INSERT 将进入 Access 数据库中的表,但是我如何告诉查询 SELECT 语句来自使用 ADODB(或其他类型)连接的 SQL Server,而不是 currentdb?
    • 一种方法是将所有源表作为链接表导入您的 Access DB,甚至复制所有数据。
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多