Что означают данные в MSysQueries?

Я использовал VBA для проверки всех запросов, форм и модулей в моей базе данных Access 2000, но это может быть довольно утомительно и медленно. Недавно я решил поближе познакомиться с системными таблицами в Access, в частности с MSysQueries и MSysObjects. Могу ли я использовать эти таблицы для более быстрого изучения моих объектов в базе данных? Конечно, эти таблицы доступны только для чтения, поэтому я не могу через них вносить какие-либо изменения в базу данных, не возвращаясь к VBA. Что означают атрибуты в MSysQueries?


person Bobort    schedule 26.06.2013    source источник


Ответы (4)


Я наткнулся на эту запись в группах Google. . Я провел дальнейшее исследование своих собственных таблиц и хотел поделиться таблицей информации, которую я создал, вдохновленный уже проделанной работой.

Каждый запрос может занимать несколько строк в таблице.

Строка с атрибутом 0 является началом запроса.

Строка с атрибутом 1 указывает тип запроса.

  • Значение флага 1 = запрос SELECT.
  • Значение флага 2 = запрос SELECT ... INTO или запрос на создание таблицы. Имя1 будет иметь имя создаваемой таблицы.
  • Значение флага 3 = запрос INSERT; Name1 будет иметь имя таблицы для вставки.
  • Значение флага 4 = запрос ОБНОВЛЕНИЯ
  • Значение флага 5 = запрос УДАЛИТЬ
  • Значение флага 6 = перекрестный запрос (преобразование)
  • Значение флага 9 = запрос UNION

Строки с атрибутом 2 (их может быть несколько) являются формальными параметрами запроса. Столбец Flag указывает тип данных (например, «10» для dbText), а столбец Name1 указывает имя параметра. Если нет строк с атрибутом 2, то запрос не имеет формальных параметров.

Строка с атрибутом 3 указывает на наличие ключевых слов UNION или DISTINCT.

  • Значение флага 0 = Ничего особенного
  • Значение флага 1 = ОБЪЕДИНЕНИЕ ВСЕХ
  • Значение флага 2 = SELECT DISTINCT
  • Значение флага 3 = ОБЪЕДИНЕНИЕ
  • Значение флага 8 = SELECT DISTINCTROW
  • Значение флага 9 = запросы к основным полям и дочерним полям

Строка с атрибутом 4 указывает, исходит ли запрос из внешней базы данных. Имя1 будет содержать источник, если существует атрибут 4.

Строки с атрибутом 5 (их может быть несколько) указывают на каждую таблицу, найденную в запросе. Если запрос является запросом UNION, поле Expression имеет разбиение по ключевому слову UNION, а поле Name2 имеет псевдоним таблицы, сгенерированный системой. Для всех остальных таблиц в запросе Имя1 — это имя таблицы, а Имя2 — это псевдоним, если он есть.

Строки с атрибутом 6 (их может быть несколько) указывают каждое отдельное поле или выражение в запросе. Если для запроса отсутствует атрибут 6, предполагается, что включены все поля. Поле Выражение содержит каждое выражение поля или имя, а Имя1 содержит псевдоним поля, если он есть.

  • Значение флага 0 = значение поля или выражения
  • Значение флага 1 = поле является заголовком столбца в перекрестном запросе.
  • Значение флага 2 = поле является заголовком строки в перекрестном запросе.

Строки с атрибутом 7 (их может быть несколько) указывают каждое отдельное выражение соединения "ON". Поле Expression содержит фактическое выражение соединения. Name1 содержит первую таблицу в соединении. Name2 содержит вторую таблицу в соединении.

  • Значение флага 1 = внутреннее соединение
  • Значение флага 2 = левое соединение
  • Значение флага 3 = правое соединение

Строка с атрибутом 8 содержит все предложение WHERE в поле Expression. Если предложение where отсутствует, атрибут 8 опускается в запросе.

Строки с атрибутом 9 (их может быть несколько) указывают каждое отдельное выражение Group By в предложении GROUP BY запроса. Поле Expression содержит каждую группу по выражению.

  • Значение флага 0 = значение поля или выражения
  • Значение флага 1 = поле является заголовком столбца в перекрестном запросе.
  • Значение флага 2 = поле является заголовком строки в перекрестном запросе.

Строки с атрибутом 11 (их может быть несколько) указывают каждое отдельное выражение Order By в предложении ORDER BY запроса. Поле Expression содержит каждый заказ по выражению. Name1 имеет "D" или "d", чтобы указать, что сортировка выполняется в порядке убывания.

Строка с атрибутом 255 — это конец запроса.

Я не совсем уверен, что делает поле Order, но я обнаружил, что оно не равно Null, и хотя иногда оно имеет значение пустой строки, оно не всегда имеет это значение. Пустые строки встречаются в атрибутах 5, 6, 7 и 9, но это не всегда пустая строка для этих атрибутов.

person Bobort    schedule 26.06.2013
comment
Атрибут = 1 с флагом = 8 указывает на сквозной запрос, Name1 возвращает строку подключения. - person Patrick Honorez; 24.04.2014
comment
Я нашел случаи, когда рабочий запрос не имел строки с атрибутом = 1. - person Patrick Honorez; 12.08.2014

Благодаря отличным объяснениям @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 и вставьте приведенный выше код.

person Patrick Honorez    schedule 24.04.2014

В дополнение к ответам Боборта и iDevlop:

Строка с атрибутом 1 указывает тип запроса.

  • Значение флага 7 = запрос DDL (например, CREATE TABLE...)
  • Значение флага 9 = пройти через запрос

Строка с атрибутом 3 указывает предикат.

  • Значение флага 1 = все значения или UNION ALL (если запрос UNION)
  • Значение флага 4 = С ОПЦИЕЙ OWNERACCESS
  • Значение флага 16 = TOP N
  • Значение флага 48 = ВЕРХНИЕ N ПРОЦЕНТОВ

Строки с атрибутом 5 (их может быть несколько) указывают каждую таблицу/запрос FROM, найденную в запросе.

  • Выражение содержит источник FROM или оператор SELECT, если запрос UNION

Строка с атрибутом 10 содержит все предложение HAVING в поле Expression. Если предложение HAVING отсутствует, атрибут 10 опускается в запросе.

Поле Order представляет собой двоичное значение BIG-ENDIAN, содержащее массив из 4 байтов (двоичные поля можно добавлять с помощью VBA, но нельзя добавлять с помощью пользовательского интерфейса, если только вы не скопируете и не вставите из двоичного поля в системную таблицу). , в большинстве баз данных в таблице 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
person ThunderFrame    schedule 08.07.2016

Совокупные значения относятся к атрибуту 3. Таким образом, дополнительные элементы включают:

  • Флаг 12 SELECT DISTINCT.... WITH OWNERACCESS OPTION
  • Флаг 18 SELECT DISTINCT TOP (т.е. 2+16)
  • Флаг 24 SELECT DISTINCTROW TOP (т.е. 8+16)
  • Флаг 50 SELECT DISTINCT TOP PERCENT (т.е. 2+48)
  • Флаг 56 SELECT DISTINCTROW TOP PERCENT (т.е. 8+48)

Я написал расширенную статью о работе таблицы MSysQueries. См. как Access хранит запросы.

person isladogs    schedule 02.02.2019