2

AccessでSQLクエリを実行する前に、クエリするテーブル名を入力するように求める方法はありますか?たとえば、列が常に一定であるとしましょう。列は「Fruit」および「Date」と呼ばれる可能性があります。ただし、バッチ番号によってはテーブル名が変わる場合があります。つまり。テーブル名は「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

バッチ番号を列としてではなくテーブル名に入れることで、スキーマでデータをエンコードしています。これはベストプラクティスではないため、私の意見では、正しい答えはデータベース設計を変更することです。

Batch現在のテーブルのすべての列を含む単一のテーブルを作成しますが、主キーの一部としてBatchNo名前が付けられた列を追加します。BatchNoBatchNoテーブルからこのテーブルにすべてのデータをロードしてから、それらのテーブルを削除します。そうすると、クエリは次のようになります。

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

テーブル名にデータを入れないでください。これは、データベースの作成方法ではありません。

少し説明すると、現在の設計がベストプラクティスに違反している理由は、まさに現在直面している問題によるものです。そのような設計で作業し、合理的でデータ駆動型の方法。

ユーザーにテーブル名を入力させることにより、ユーザー提供のテーブル名を許可されたテーブル名のホワイトリストと比較することにも注意を払わないと、SQLインジェクションの危険性も生じます。これはAccessではそれほど大きな問題ではないかもしれませんが、それでも間違った道を進んでおり、専門的なデータベース作業以外の何かのためにトレーニングを行っています。キャリアを伸ばしたいと思ったら、正しいやり方を学ぶために「きれいな状態」から始める前に、まずたくさんのことを学ばなくてはならないのは残念です。

于 2013-03-18T18:02:43.730 に答える