如何在Access中动态修改子查询SQL?

如何在Access中动态修改子查询SQL?,sql,vba,ms-access,ms-access-2010,Sql,Vba,Ms Access,Ms Access 2010,假设我有两个访问查询getData\u join和getData\u static: select * from someTable where someTable.property="value" getData\u static: select * from someTable where someTable.property="value" getData\u join: select * from someTable inner join otherTable on someTabl

假设我有两个访问查询
getData\u join
getData\u static

select * from someTable where someTable.property="value"
getData\u static

select * from someTable where someTable.property="value"
getData\u join

select * from someTable inner join otherTable on someTable.property=otherTable.property
数据库中有许多查询调用
getData\u join
,例如
items\u getData

select * from items inner join getData_join on items.property=getData_join.property
我想在前端设置一个开关,让用户选择这些查询是调用
getData\u static
还是
getData\u join
。我没有创建两组单独的查询,而是考虑使用一个带有伪子句的泛型
getData
查询,如:

select * from someTable [insertClause]
然后使用QueryDef动态定义SQL,如下所示:

Function modify_getData(isJoin As Boolean) As QueryDef

Dim qdf As QueryDef

Set qdf = CurrentDb.QueryDefs("getData")

If isJoin Then
    qdf.sql = Replace(qdf.sql, "[insertClause]", "inner join otherTable on someTable.property=otherTable.property")
Else
    qdf.sql = Replace(qdf.sql, "[insertClause]", "where someTable.property=""value""")
End If

Set modify_getData = qdf

End Function

问题是前端没有直接调用
getData
,而是调用
items\u getData
,因此创建一个修改的
getData
QueryDef在这里没有用处。有没有办法在Access中动态修改子查询的SQL,以便修改后的SQL将被另一个调用它的查询使用?

您必须在所有查询中替换查询名称,这可以通过循环
Db.querydfs
轻松完成

我将有一个只使用
SELECT*FROM getData\u static
的引用查询

阅读其
.Sql
,以确定查询的当前状态。如果与“开关”不匹配,则运行

Set Db=CurrentDb
对于Db.querydfs中的每个qdf
qdf.Sql=Replace(qdf.Sql,“getData\u static”,“getData\u join”)
下一个qdf
反之亦然


您必须确保“getData\u static”和“getData\u join”是唯一的,它们在任何查询中都不会作为另一个字符串的一部分出现。

您必须在所有查询中替换查询名称,这可以通过循环
Db.querydfs
轻松完成

我将有一个只使用
SELECT*FROM getData\u static
的引用查询

阅读其
.Sql
,以确定查询的当前状态。如果与“开关”不匹配,则运行

Set Db=CurrentDb
对于Db.querydfs中的每个qdf
qdf.Sql=Replace(qdf.Sql,“getData\u static”,“getData\u join”)
下一个qdf
反之亦然


您必须确保“getData\u static”和“getData\u join”是唯一的,它们永远不会作为另一个字符串的一部分出现在任何查询中。

为什么不保留为两个单独的查询,特别是因为许多其他查询甚至表单/报表都使用它们?您的代码可能会中断,任何使用查询的对象都将失败。查询是非数据应用程序项,因此不会占用太多空间。Plus Access的引擎编译和优化保存的查询,而不是VBA脚本化的查询。@帕菲:我认为问题在于所有这些查询的维护,而不是空间。您的替换只能工作一次,因为之后将不再有
[insertClause]
在qdf.sql中。为什么不保留为两个单独的查询,特别是因为许多其他查询甚至表单/报表都使用它们?您的代码可能会中断,任何使用查询的对象都将失败。查询是非数据应用程序项,因此不会占用太多空间。Plus Access的引擎编译和优化保存的查询,而不是VBA脚本化的查询。@帕菲:我认为问题在于所有这些查询的维护,而不是空间。您的替换只能工作一次,因为之后qdf.sql中就不再有
[insertClause]