VBA を使用して、Access 2000 データベース内のすべてのクエリ、フォーム、およびモジュールを調べてきましたが、非常に面倒で時間がかかります。最近、Access のシステム テーブル、特に MSysQueries と MSysObjects を詳しく調べることにしました。これらのテーブルを使用して、データベース内のオブジェクトをより迅速に調べることができますか? もちろん、これらのテーブルは読み取り専用であるため、VBA に戻らない限り、テーブルを介してデータベースを変更することはできません。MSysQueries の属性は何を意味しますか?
4 に答える
さて、 Googleグループでこの投稿に出くわしました。私は自分のテーブルをさらに調査し、すでに行った作業に触発されて作成した情報のテーブルを共有したいと考えました。
各クエリは、テーブル内の複数の行を使用できます。
属性 0 の行がクエリの先頭です。
属性 1 の行は、クエリのタイプを示します。
- フラグ値 1 = SELECT クエリ。
- フラグ値 2 = SELECT ... INTO クエリ、またはテーブル作成クエリ。Name1 には、作成されるテーブルの名前が付けられます。
- フラグ値 3 = INSERT クエリ。Name1 には、挿入先のテーブルの名前が入ります。
- フラグ値 4 = UPDATE クエリ
- フラグ値 5 = DELETE クエリ
- フラグ値 6 = クロス集計クエリ (TRANSFORM)
- フラグ値 9 = UNION クエリ
属性 2 (複数の可能性があります) を持つ行は、クエリの各仮パラメーターです。Flag 列はデータ型 (つまり、dbText の場合は「10」) を示し、Name1 列はパラメーターの名前を示します。属性 2 を持つ行がない場合、クエリには仮パラメータがありません。
属性 3 の行は、UNION または DISTINCT キーワードの存在を示します。
- フラグ値 0 = 特に何もない
- フラグ値 1 = UNION ALL
- フラグ値 2 = SELECT DISTINCT
- フラグ値 3 = UNION
- フラグ値 8 = SELECT DISTINCTROW
- フラグ値 9 = マスター フィールドと子フィールドに対するクエリ
属性 4 の行は、クエリが外部データベースからのものかどうかを示します。属性 4 が存在する場合、Name1 にはソースが含まれます。
属性 5 の行 (複数ある可能性があります) は、クエリで見つかった各テーブルを示します。クエリが UNION クエリの場合、[式] フィールドには UNION キーワードで分割があり、[名前 2] フィールドにはシステム生成のテーブル エイリアスがあります。クエリ内の他のすべてのテーブルの場合、Name1 はテーブルの名前で、Name2 はエイリアス (存在する場合) です。
属性 6 の行 (複数ある可能性があります) は、クエリ内の各フィールドまたは式を示します。クエリに属性 6 がない場合、想定される動作は、すべてのフィールドが含まれていることです。Expression フィールドには各フィールド式または名前が含まれ、Name1 にはフィールド エイリアスが含まれます (存在する場合)。
- フラグ値 0 = フィールドまたは式の値
- フラグ値 1 = フィールドはクロス集計クエリの列見出しです。
- フラグ値 2 = フィールドはクロス集計クエリの行見出しです。
属性 7 の行 (複数ある可能性があります) は、それぞれの単一の結合 "ON" 式を示します。Expression フィールドには、実際の結合式が含まれます。Name1 には、結合の最初のテーブルが含まれています。Name2 には、結合の 2 番目のテーブルが含まれています。
- フラグ値 1 = 内部結合
- フラグ値 2 = 左結合
- フラグ値 3 = 右結合
属性 8 の行には、Expression フィールドに WHERE 句全体が含まれています。where 句がない場合、属性 8 はクエリから省略されます。
属性 9 の行 (複数ある可能性があります) は、クエリの GROUP BY 句内の各単一の Group By 式を示します。[式] フィールドには、式ごとに各グループが含まれます。
- フラグ値 0 = フィールドまたは式の値
- フラグ値 1 = フィールドはクロス集計クエリの列見出しです。
- フラグ値 2 = フィールドはクロス集計クエリの行見出しです。
属性が 11 の行 (複数ある可能性があります) は、クエリの ORDER BY 句の各単一の Order By 式を示します。Expression フィールドには、各 order by 式が含まれます。Name1 には、並べ替えが降順で行われることを示す "D" または "d" があります。
属性 255 を持つ行はクエリの最後です。
Order フィールドが何をするのか正確にはわかりませんが、Null ではなく、空の文字列の値を持つこともありますが、常にその値を持つとは限りません。空の文字列は属性 5、6、7、および 9 で発生しますが、これらの属性が常に空の文字列であるとは限りません。
@Bobort の優れた説明のおかげで、現在のデータベース内のすべてのクエリを、入力テーブル/クエリ、クエリの種類、およびターゲット テーブル (アクション クエリの場合) とともに一覧表示するクエリを作成できました。
それをここで共有できればと思いました。
SELECT MSysObjects.Name AS queryName,
Mid("SelectMakTblAppendUpdateDeleteXtab 777777PassThUnion ",([msysqueries]![Flag]-1)*6+1,6) AS queryType,
src.Name1 AS [Input],
MSysQueries.Name1 AS Target
FROM (MSysQueries INNER JOIN MSysObjects ON MSysQueries.ObjectId = MSysObjects.Id)
LEFT JOIN (select * from MSysQueries WHERE Attribute = 5 ) AS src
ON MSysQueries.ObjectId = src.ObjectId
WHERE (((MSysObjects.Name)>"~z") AND ((MSysQueries.Attribute) =1))
ORDER BY MSysObjects.Name, src.Name1;
使用するには、SQL ビューでクエリを作成し、上記のコードを貼り付けるだけです。
さらに、Bobort と iDevlop の回答:
属性 1 の行は、クエリのタイプを示します。
- フラグ値 7 = DDL クエリ (例
CREATE TABLE...
) - フラグ値 9 = クエリを通過
属性 3 の行は、述語を示します。
- フラグ値 1 = すべての値、または UNION ALL (UNION クエリの場合)
- フラグ値 4 = OWNERACCESS オプションあり
- フラグ値 16 = TOP N
- フラグ値 48 = TOP N PERCENT
属性 5 の行 (複数ある可能性があります) は、クエリで見つかった各FROMテーブル/クエリを示します
- 式には FROM ソース、または UNION クエリの場合は SELECT ステートメントが含まれます
属性 10 の行には、式フィールドに HAVING 句全体が含まれています。HAVING 句がない場合、属性 10 はクエリから省略されます。
フィールドは、Order
4 バイトの配列を含む BIG-ENDIAN バイナリ値です (バイナリ フィールドは VBA で追加できますが、システム テーブルのバイナリ フィールドからコピー アンド ペーストしない限り、UI を使用して追加することはできません)。ただし、ほとんどのデータベースのMSysQueries
テーブルでは、255 を超えるバイナリ値に遭遇する可能性は低いため、インデックス 3 のバイトを検査することで、バイトへの変換をショートカットできます。次に例を示します。
Sub EnumOrder()
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset( _
" SELECT * FROM MSysQueries " & _
" WHERE Attribute = 6 " & _
"ORDER BY ObjectId Asc, [Order] Asc")
With rst
Do While Not .EOF
Debug.Print .Fields("ObjectId"), .Fields("Order")(3)
.MoveNext
Loop
.Close
End With
End Sub