Access поддерживает скрытую системную таблицу MSysObjects, которая содержит поле (Flags), в котором хранится значение, указывающее тип запроса. Вы можете попробовать следующую функцию с каждым из имен запросов из вашего списка и использовать возвращаемое значение, чтобы определить, использовать ли Database.Execute () или Database.OpenRecordset ()
Функция требует разрешения на чтение для MSysObjects. Я слышал сообщения о том, что некоторым пользователям Access 2007 отказано в разрешении читать MSysObjects. Однако я не сталкивался с этой проблемой в Access 2007.
Я протестировал несколько типов запросов, чтобы определить значения флагов. Если один из ваших запросов относится к типу, который я не проверял, функция вернет значение Flags как нераспознанное. Вы можете изменить функцию для включения этого типа флагов.
Единственный DDL-запрос, который я тестировал, был DROP TABLE (Flags = 96).
Также имейте в виду, что не все запросы «SELECT ... FROM ...» являются запросами выбора для вашей цели (возвращая набор записей). Запрос, такой как «SELECT fields INTO newtable FROM oldtable;» не возвращает записи, и пользовательский интерфейс Access классифицирует его как запрос Make Table.
Public Function QueryType(ByVal pQueryName As String) As String
Dim lngFlags As Long
Dim strType As String
Dim strCriteria As String
strCriteria = "[Name] = """ & pQueryName & """ And [Type] = 5"
lngFlags = DLookup("Flags", "MSysObjects", strCriteria)
Select Case lngFlags
Case 0
strType = "Select"
Case 16
strType = "Crosstab"
Case 32
strType = "Delete"
Case 48
strType = "Update"
Case 64
strType = "Append"
Case 80
strType = "Make Table"
Case 96
strType = "Drop Table"
Case 128
strType = "Union"
Case Else
strType = "Flags " & CStr(lngFlags) & " unrecognized"
End Select
QueryType = strType
End Function