Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access MSysQueries中的数据是什么意思?_Ms Access_Ms Access 2000 - Fatal编程技术网

Ms access MSysQueries中的数据是什么意思?

Ms access MSysQueries中的数据是什么意思?,ms-access,ms-access-2000,Ms Access,Ms Access 2000,我一直在使用VBA检查Access 2000数据库中的所有查询、表单和模块,但这可能会非常繁琐和缓慢。最近,我决定仔细研究Access中的系统表,特别是MSysQueries和MSysObjects。我可以使用这些表更快地检查数据库中的对象吗?当然,这些表是只读的,因此如果不返回VBA,我无法通过它们对数据库进行任何修改。MSysQueries中的属性是什么意思?嗯,我是在谷歌群组上遇到的。我在自己的表格上做了进一步的调查,并想分享一个我根据已经完成的工作而创建的信息表格 每个查询可以占用表中的

我一直在使用VBA检查Access 2000数据库中的所有查询、表单和模块,但这可能会非常繁琐和缓慢。最近,我决定仔细研究Access中的系统表,特别是MSysQueries和MSysObjects。我可以使用这些表更快地检查数据库中的对象吗?当然,这些表是只读的,因此如果不返回VBA,我无法通过它们对数据库进行任何修改。MSysQueries中的属性是什么意思?

嗯,我是在谷歌群组上遇到的。我在自己的表格上做了进一步的调查,并想分享一个我根据已经完成的工作而创建的信息表格

每个查询可以占用表中的多行

属性为0的行是查询的开始

属性为1的行表示查询的类型

  • 标志值1=选择查询
  • 标志值2=选择。。。进入查询,或生成表查询。Name1将具有所创建表的名称
  • 标志值3=插入查询;Name1将具有要插入的表的名称
  • 标志值4=更新查询
  • 标志值5=删除查询
  • 标志值6=交叉表查询(转换)
  • 标志值9=联合查询
属性为2(可能有多个)的行是查询的每个形式参数。Flag列表示数据类型(即dbText的“10”),Name1列表示参数的名称。如果没有属性为2的行,则查询没有形式参数

属性为3的行表示存在UNION或DISTINCT关键字

  • 标志值0=无特殊情况
  • 标志值1=联合所有
  • 标志值2=选择不同
  • 标志值3=联合
  • 标志值8=选择DISTINCTROW
  • 标志值9=对主字段和子字段的查询
属性为4的行指示查询是否来自外部数据库。如果属性4存在,名称1将包含源

属性为5的行(可能有多个)表示查询中找到的每个表。如果查询是联合查询,则表达式字段在UNION关键字上有一个拆分,而名称2字段有一个系统生成的表别名。对于查询中的所有其他表,Name1是表的名称,Name2是别名(如果有)

属性为6的行(可能有多个)表示查询中的每个字段或表达式。如果查询没有属性6,则行为假定包括所有字段。表达式字段包含每个字段表达式或名称,如果有字段别名,则名称1包含字段别名

  • 标志值0=字段或表达式的值
  • 标志值1=该字段是交叉表查询中的列标题
  • 标志值2=该字段是交叉表查询中的行标题
属性为7的行(可能有多个)表示每个连接“开”表达式。表达式字段包含实际的联接表达式。Name1包含联接中的第一个表。Name2包含联接中的第二个表

  • 标志值1=内部联接
  • 标志值2=左连接
  • 标志值3=右连接
属性为8的行包含表达式字段中的整个WHERE子句。如果没有where子句,查询中将省略属性8

属性为9的行(可能有多个)表示查询的GROUPBY子句中的每个GROUPBY表达式。表达式字段按表达式包含每个组

  • 标志值0=字段或表达式的值
  • 标志值1=该字段是交叉表查询中的列标题
  • 标志值2=该字段是交叉表查询中的行标题
属性为11的行(可能有多个)表示查询的ORDERBY子句中的每个ORDERBY表达式。表达式字段包含每个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查询(例如
    创建表…
  • 标志值9=传递查询
属性为3的行表示谓词

  • 标志值1=所有值,或UNION All(如果是UNION查询)
  • 标志值4=带有OWNERACCESS选项
  • 标志值16=顶部N
  • 标志值48=顶部N百分比
属性为5的行(可能有多行)表示查询中找到的表/查询中的每个

  • 表达式包含FROM源,如果是联合查询,则包含SELECT语句
属性为10的行在表达式字段中包含整个HAVING子句。如果没有HAVING子句,则查询中将省略属性10

Order
字段是一个包含4字节数组的大端二进制值(二进制字段可以使用VBA添加,但不能使用UI添加,除非从系统表中的二进制字段复制和粘贴)
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