0

我正在使用 MS Access 2003,我有一个“长”查询,例如

SELECT * FROM [Table 1]
UNION ALL
SELECT * FROM [Table 2]
UNION ALL 
SELECT * FROM [Table 3]
....
SELECT * FROM [Table 100]

每个表从 HTML 文件链接到某个表。有时我的 HTML 源文件包含不同数量的表 - 少于 100 个,当然我的执行查询返回错误“3078:找不到表...”。为避免此错误,我尝试使用 VBA 代码动态构建此查询。所以我有下一个逻辑:

  1. 检查表是否存在
  2. 构建查询字符串(添加到字符串“UNION ALL SELECT * FROM [Table” & i & “]”)
  3. On Error = 3078 执行查询(基于查询字符串)。

它可以工作,但是检查表是否存在(每次数据库尝试从源链接此表)需要花费大量时间。我有其他方法吗?是否可以从“长”查询中返回“部分”结果(仅适用于那些存在并跳过另一个表的表)并且不单独检查它们?

4

2 回答 2

2

TableDef您可以通过该选项访问您的表,而不是尝试为每个表计算表中有多少记录。这将允许您比查询每个表更快地构建查询,以查看它是否存在。不过,它确实需要您的表当前已链接。

Dim db as DAO.Database
Dim wrk as DAO.Workspace
Dim tdf as DAO.TableDef

Set wrk = DBEngine.Workspaces(0)
Set db = wrk.OpenDatabase(databasePath, False, False, connection type/password)

For Each tdf in db.TableDefs
    'Add it to your query string here.
Next 

db.close
wrk.close
Set tdf = Nothing
Set db = Nothing
Set wrk = Nothing
于 2013-05-31T12:39:53.913 回答
1

处理它的一种方法是创建约 100 个本地表,一个用于 HTML 源代码中的每个(潜在)表。使用 VBA 很容易做到这一点,因为表结构是相同的。您可以只执行一次,然后重新使用本地表(见下文)。

然后,当您想检索最新版本的数据时,您可以

  • DELETE FROM删除所有现有行的本地表

  • 运行一个循环INSERT INTO [local Table n] SELECT * FROM [Table n]直到你“用完” HTML 表格(即,当你收到错误时)

  • 然后对本地表运行长查询。 UNION ALL

这样,所有本地表将始终存在。(如果 HTML 表不存在,那么其对应的本地表将只是空的。)

于 2013-05-31T12:38:52.270 回答