Я использовал VBA для проверки всех запросов, форм и модулей в моей базе данных Access 2000, но это может быть довольно утомительно и медленно. Недавно я решил поближе познакомиться с системными таблицами в Access, в частности с MSysQueries и MSysObjects. Могу ли я использовать эти таблицы для более быстрого изучения моих объектов в базе данных? Конечно, эти таблицы доступны только для чтения, поэтому я не могу через них вносить какие-либо изменения в базу данных, не возвращаясь к VBA. Что означают атрибуты в MSysQueries?
Что означают данные в MSysQueries?
Ответы (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, но это не всегда пустая строка для этих атрибутов.
Благодаря отличным объяснениям @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 и вставьте приведенный выше код.
В дополнение к ответам Боборта и 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
Совокупные значения относятся к атрибуту 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 хранит запросы.