7

VBA を使用して、Access 2000 データベース内のすべてのクエリ、フォーム、およびモジュールを調べてきましたが、非常に面倒で時間がかかります。最近、Access のシステム テーブル、特に MSysQueries と MSysObjects を詳しく調べることにしました。これらのテーブルを使用して、データベース内のオブジェクトをより迅速に調べることができますか? もちろん、これらのテーブルは読み取り専用であるため、VBA に戻らない限り、テーブルを介してデータベースを変更することはできません。MSysQueries の属性は何を意味しますか?

4

4 に答える 4

15

さて、 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 で発生しますが、これらの属性が常に空の文字列であるとは限りません。

于 2013-06-26T19:52:26.797 に答える
4

@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 ビューでクエリを作成し、上記のコードを貼り付けるだけです。

于 2014-04-24T14:56:54.773 に答える
3

さらに、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 はクエリから省略されます。

フィールドは、Order4 バイトの配列を含む 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
于 2016-07-08T05:08:05.720 に答える