动态来自基于列名的语句

时间:2013-10-10 15:45:31

标签: sql vba ms-access access-vba user-defined-functions

背景资料:
我通过> 10(以及不断增长的)链接表获取ms access 2010数据库,来源:csv& xls来自需要组合和查询的分散工具。源代码是“脏”的,我使用带有附加代码的插入查询来清理它们,并将记录存储在本地表中,并使用索引来获得更好的性能。首先使用删除查询清空本地表。在USysApplicationLog中的本地表上使用数据宏After Insert: LogEvent记录插入查询。 Data宏在USysApplicationLog中生成大量记录,而每个插入每个表1个就足以满足我的需要。打开问题,但目前不太重要。

本地表与链接表的名称相同,后缀为“-local” 示例:csvMachines / cvsMachines-local,csvCustomers / csvCustomers-local等。

目前我正在手动检查所有内容,执行所有查询等。但是还在寻找一种自动化方法。

在将数据库与本地表一起使用之前,我想检查是否:

  • 本地表格是最新的 通过查询USysApplicationLog和UDF函数来检查源的修改日期
  • 填写本地表格 我的问题的理由

寻找一种智能方式(sql,vba或udf)来组合以下工作查询

SELECT MSysObjects.NAME AS LinkedTableName
    ,[LinkedTableName] & "-local" AS LocalTableName
FROM MSysObjects
WHERE (((MSysObjects.DATABASE) IS NOT NULL));

每个本地表名称都有一个简单的SELECT count(*)

尝试了以下但Access无法找到LocalTableName作为表。

SELECT MSysObjects.NAME AS LinkedTableName
    ,[LinkedTableName] & "-local" AS LocalTableName
    ,(
        SELECT count(*)
        FROM [LocalTableName]
        ) AS LocalTableRecordCount
FROM MSysObjects
WHERE (((MSysObjects.DATABASE) IS NOT NULL));

查看与Create table - dynamic name of tableMS Access query with dynamic from statements相似的旧问题,但没有看到如何在我的情况下实施他们的解决方案。

2 个答案:

答案 0 :(得分:2)

Access不允许您在运行时为FROM数据源提供名称。它只是不支持这种能力。

由于您在此问题上有VBA标记,因此您可能会考虑一个循环遍历表名的过程并检索每个记录的记录计数。

对于每个表名......

strSelect = "SELECT Count(*) FROM " & LocalTableName
MsgBox CurrentDb.OpenRecordset(strSelect)(0)

或者查看TableDef.RecordCount属性...

MsgBox CurrentDb.TableDefs(LocalTableName).RecordCount

答案 1 :(得分:1)

正在寻找另一个问题的解决方案,我在Access Help中找到了此问题的替代答案:expression.DCount(Expr, Domain, Criteria)

我的情况的工作查询:

SELECT MSysObjects.NAME AS LinkedTableName
    ,[LinkedTableName] & "-local" AS LocalTableName
    ,DCount("*", [LinkedTableName] & "-local") AS LocalTableRecordCount
FROM MSysObjects
WHERE (((MSysObjects.DATABASE) IS NOT NULL));