【问题标题】:How to create temp tables in SQL Server via MS Access如何通过 MS Access 在 SQL Server 中创建临时表
【发布时间】:2013-05-26 07:46:30
【问题描述】:

我有一个到 SQL Server 的 ODBC 连接。我需要在 Access 中处理数据,但耗时太长。我的想法是将这些数据推送到 SQL Server 临时表并让 SQL Server 进行处理。我的 Access 数据库中有许多传递查询,但不知道如何创建从 Access 到 SQL Server 的临时表。有没有办法使用查询或 VBA 代码来做到这一点?

【问题讨论】:

  • 你可以通过在服务器上手动创建一个常规表来绕过这个问题吗?
  • 我可以,但我担心请求会被拒绝。但我确实有权创建临时表。

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


【解决方案1】:

这是我用来调用 DB2 存储过程的 VBA 代码的 sn-p。相同的技术应该适用于任何 DDL 语句。为此,请创建一个传递查询并将您的 CREATE TABLE #tblname... 语句作为其 SQL 文本。

重要提示:然后打开查询的属性表并将“返回记录”属性设置为“否”。

Dim qdf As QueryDef
Set qdf = CurrentDb.QueryDefs("qry_SP_CHANGE_COLUMN")
qdf.Connect = CurrentDb.TableDefs("SCHEMA_tblName").Connect
qdf.SQL = "call SCHEMA.SP_CHANGE_COLUMN(...)"
qdf.Execute dbFailOnError
qdf.Close
Set qdf = Nothing

注意,您可能不必更改 SQL 文本。如果表结构永远不会改变,您可以将其保留在查询 def 中。

您面临的挑战是您必须对临时表的任何操作使用相同的连接。连接关闭的那一刻,您的临时表将消失,因为它是本地临时表,并且仅对该连接可见。如果您有权这样做,您可以使用全局临时表“##”来避免这种情况。

【讨论】:

    【解决方案2】:

    Brian 是正确的,您可以使用 Pass-Through 查询在 SQL Server 数据库中创建临时表。我通过在 Access 中创建以下四个传递查询来确认这一点:

    [ptq1 创建临时表]

    BEGIN TRY
        DROP TABLE #tblname
    END TRY
    BEGIN CATCH
        -- do nothing
    END CATCH
    CREATE TABLE #tblname (intInput int, intResult int);
    

    [ptq2 填充临时表]

    INSERT INTO #tblname (intInput) VALUES (1)
    

    [ptq3 做计算]

    UPDATE #tblname SET intResult=intInput*2
    

    [ptq4 检索结果]

    SELECT * FROM #tblname
    

    我可以通过在 Access 的已保存查询列表中双击它们来连续运行它们,最终查询返回

    intInput  IntResult
    --------  ---------
           1          2
    

    这里的绊脚石似乎是如何将本地Access表中的数据放入临时表中。在 VBA 中我都试过了

    DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;DSN=myDB", acTable, "#tblname", "sqlTemp"
    

    Set tbd = cdb.CreateTableDef("sqlTemp")
    tbd.Connect = "ODBC;DSN=myDb;Trusted_Connection=Yes;APP=Microsoft Office 2010;DATABASE=myDb;"
    tbd.SourceTableName = "#tblname"
    cdb.TableDefs.Append tbd
    

    这两种方法都失败了,因为它们无法“看到”临时表。 (当我尝试在同一个 SQL Server 数据库中创建指向“真实”表的链接时,完全相同的代码起作用。)我还尝试使用 tbd.OpenRecordset 创建记录集而不将 TableDef 附加到 TableDefs 集合,但失败了,也是。

    如果没有指向临时表的链接,填充它似乎会出现问题。我想一个可以使用类似...的代码

    Set rst = cdb.OpenRecordset("localTable", dbOpenSnapshot)
    Do While Not rst.EOF
        Set qdf = cdb.CreateQueryDef("", "INSERT INTO [#tblname] (intInput) VALUES (" & rst!intInput & ")")
        qdf.Connect = "ODBC;DSN=myDb;Trusted_Connection=Yes;DATABASE=myDb;"
        qdf.ReturnsRecords = False
        qdf.Execute dbFailOnError
        Set qdf = Nothing
        rst.MoveNext
    Loop
    rst.Close
    Set rst = Nothing
    

    ... 将数据从本地表逐行传输到临时表,但这对于大量列可能会变得相当乏味,对于大量行可能会相当慢。

    因此,如果我处于您的位置,我会尝试说明在 SQL Server 数据库中创建“真实”表的理由。它肯定会让事情变得简单得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多