3

Я знаю, что именно так вы получите список всех таблиц в базе данных (и даже больше, если вы измените критерии:

SELECT *
FROM MSysObjects
WHERE (((MSysObjects.Type)=1) AND ((MSysObjects.Flags)=0));

Но есть ли подобный способ получить список полей и к каким таблицам они принадлежат? Я думаю, что это было бы очень полезно для устранения неполадок и проведения быстрого аудита (т. Е. Ответа "в каких других таблицах используется это поле или группа полей"). Но по какой-то причине не смог найти ответ в интернете.

Если у кого-то есть относительно простой способ сделать это через VBA, это тоже может быть вариантом. Благодарю.

2 ответа2

4

К сожалению, имена полей не доступны через хороший, компактный SQL-запрос. Этот код напечатает имя таблицы и каждое поле в отдельной строке в окне отладки.

Private Sub ShowTableFields()

Dim db As Database
Dim tdf As TableDef
Dim x As Integer

Set db = CurrentDb

For Each tdf In db.TableDefs
   If Left(tdf.Name, 4) <> "MSys" Then ' Don't enumerate the system tables
      For x = 0 To tdf.Fields.Count - 1
      Debug.Print tdf.Name & "','" & tdf.Fields(x).Name
      Next x
   End If
Next tdf
End Sub
1

В этом конкретном случае вы можете найти схемы ADO полезными.

Это будет список полей и некоторые свойства для конкретной таблицы. Будьте осторожны с типами данных, вы можете не получить точное совпадение с типами DAO. Вам понадобится ссылка на Microsoft ActiveX Data Objects x.x Library , если вы не используете позднюю привязку.

Dim cn As New ADODB.Connection, cn2 As New ADODB.Connection
Dim rs As ADODB.Recordset, rs2 As ADODB.Recordset

   Set cn = CurrentProject.Connection

   Set rs = cn.OpenSchema(adSchemaTables, _
       Array(Empty, Empty, Empty, "tablenamehere"))

   While Not rs.EOF
       Debug.Print rs!table_name; "   desc=  "; rs!Description
       Set rs2 = cn.OpenSchema(adSchemaColumns, _
           Array(Empty, Empty, "" & rs!table_name & ""))
       While Not rs2.EOF
           Debug.Print "     " & rs2!Column_Name
           Debug.Print "     " & rs2!Data_Type
           Debug.Print "     " & rs2!Description
           Debug.Print "     " & rs2!Is_Nullable
           rs2.MoveNext
       Wend
   rs.MoveNext
   Wend
   rs.Close
   Set cn = Nothing

Вы также можете посмотреть на вещи с другой стороны и получить список таблиц, которые содержат определенное поле.

Dim cn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim strTempList As String

   On Error GoTo Error_Trap

   Set cn = CurrentProject.Connection

   'Get names of all tables that have a column called <SelectFieldName>
   Set rs = cn.OpenSchema(adSchemaColumns, _
   Array(Empty, Empty, Empty, SelectFieldName))

   'List the tables that have been selected
   While Not rs.EOF
       'Exclude MS system tables
       If Left(rs!Table_Name, 4) <> "MSys" Then
           strTempList = strTempList & "," & rs!Table_Name
       End If
       rs.MoveNext
   Wend

   ListTablesContainingField = Mid(strTempList, 2)

От: http://wiki.lessthandot.com/index.php/ADO_Schemas

У Stackoverflow есть немало информации на эту тему: https://stackoverflow.com/search?q=%5Bms-access%5D+schema

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .