2

在 Access 中运行 SQL 查询之前,是否有办法提示您输入要查询的表名?例如,假设列将始终保持不变。这些列可以称为“水果”和“日期”。但是,表名可能会根据批号而改变。IE。表名可以是“BatchNO_1”或“BatchNO_2”或“BatchNO_3”等。所以假设我有一个类似的 SQL:

select Fruit, Date from BatchNO_1 where Fruit = "Apples"  

有没有一种方法可以提示我输入表名并让 SQL 使用我输入的表名来执行查询?

4

2 回答 2

4

不可以。表名不能作为参数传递给查询。您必须自己构建查询。

Dim tableName as String, sql As String

tableName = InputBox("Please enter the table name")
If tableName <> "" Then
    sql = "SELECT Fruit, Date FROM [" & tableName & "] WHERE Fruit = 'Apples'"
    'TODO: execute the query here
End If

例如,您可以像这样更改现有查询的查询文本:

CurrentDb.QueryDefs("myQuery").SQL = sql

或者你可以像这样执行查询

Dim db As DAO.Database, rs As DAO.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset(sql)
Do Until rs.EOF
    Debug.Print rs!Fruit & " " & rs!Date
    rs.MoveNext
Loop
rs.Close: Set rs = Nothing
db.Close: set db = Nothing
于 2013-03-18T17:49:52.817 回答
2

通过将批号放在表名中而不是列中,您可以在schema中编码数据。这不是最佳实践,所以在我看来,正确的答案是改变你的数据库设计。

Batch使用当前表中的所有列创建一个BatchNo表,但添加一个名BatchNo为主键的列。将 BatchNo 表中的所有数据加载到该表中,然后删除这些表。然后您的查询将直接如下所示:

SELECT Fruit, Date
FROM Batch
WHERE
   Fruit = "Apples"
   AND BatchNo = [Enter Batch No];

不要将数据放在表名中。这不是数据库应该采用的方式。

稍微解释一下,您当前的设计违反最佳实践的原因正是由于您现在面临的问题——您必须做的恶作剧和奇怪的事情才能使用这样的设计并尝试在一个合理的,数据驱动的,方式。

通过让用户输入表名,如果您不小心将用户提供的表名与允许的表名的白名单进行比较,也会产生 SQL 注入的危险。虽然这在 Access 中可能没什么大不了的,但它仍然走在错误的道路上,并且正在为专业数据库工作之外的其他内容进行培训。如果您想发展自己的事业,那么在您甚至可以从“白板”开始学习正确的做事方式之前,首先必须忘掉一堆东西,这将是令人遗憾的。

于 2013-03-18T18:02:43.730 回答