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 数据库中创建“真实”表的理由。它肯定会让事情变得简单得多。