Как указать имя поля в таблице в Access с использованием SQL

Подскажите, пожалуйста, можно ли перечислить все имена полей в таблице MS Access?

Ответ 1

Я слишком много работаю в ms-доступе.

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

Например:

dim rst as new adodb.recordset
rst.open "SELECT * FROM SomeTable", CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
' Note: adOpenForwardOnly and adLockReadOnly are the default values '
' for the CursorType and LockType arguments, so they are optional here '
' and are shown only for completeness '

dim ii as integer
dim ss as string
for ii = 0 to rst.fields.count - 1
    ss = ss & "," & rst.fields(ii).name
next ii

Строковая переменная ss будет содержать список разделенных запятыми всех имен столбцов в таблице с именем "SomeTable".

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

Помогает ли это?

Ответ 2

Эта версия легко запускается и вставляется прямо в Access. Добавьте эту функцию в модуль, запустите с F5 и скопируйте результат из окна ввода:

Public Function FieldNames() As String

    Dim sTable As String
    Dim rs As DAO.Recordset
    Dim n As Long
    Dim sResult As String

    sTable = InputBox("Name of table?")
    If sTable = "" Then
        Exit Function
    End If

    Set rs = CurrentDb.OpenRecordset(sTable)

    With rs
        For n = 0 To .Fields.Count - 1
            sResult = sResult & .Fields(n).Name & vbCrLf
        Next 'n
        .Close
    End With

    Set rs = Nothing

    InputBox "Result:" & vbCrLf & vbCrLf _
            & "Copy this text (it looks jumbled, but it has one field on each line)", _
            "FieldNames()", sResult

End Function

Альтернативный выход:

Пользователь user1003916 предоставил альтернативу InputBox для преодоления ограничения на 1024 символа (я еще не тестировал это):

Sub CopyText(Text As String)

    'VBA Macro using late binding to copy text to clipboard.
    'By Justin Kay, 8/15/2014

    Dim MSForms_DataObject As Object
    Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

    MSForms_DataObject.SetText Text
    MSForms_DataObject.PutInClipboard
    Set MSForms_DataObject = Nothing

End Sub

Ответ 3

ОБНОВЛЕНИЕ: ИСПОЛЬЗОВАТЬ ЭТОТ SQL QUERY, ВЫ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ИНСТРУМЕНТ, ТАК КАК ДРАЙВЕР. КЛИЕНТ ДОСТУПА НЕ ДОПУСКАЕТ ВАС, ЧТОБЫ ЗАПРОСИТЬ ЭТО СКРЫТЫЕ КОНСТРУКЦИИ.

YIKES! ИМО: Я не могу представить, что хочу нырнуть в темное подбрюшье VBA.

Как получить столбцы таблицы доступа по SQL

SELECT * FROM information_schema.columns 
    WHERE TABLE_NAME="YOUR_TABLE_NAME" 
       AND 
    TABLE_SCHEMA="PUBLIC" 

PS Я заметил, что Access вызвал мою схему "PUBLIC"

Выше использовался Access 2016 и был протестирован через ODBC и jdbc: ucanaccess и работает как прелесть.

Пример вывода

Снимок экрана с именами столбцов

Ответ 4

Вы можете просто использовать инструмент Documenter. Перейдите к Database Tools > Database Documenter, выберите таблицу и нажмите OK.

Ответ 5

Кажется, эта задача была проще в более старые времена. Вероятно, этот ответ сильно зависит от версии. Он работает для меня в быстром тестировании с помощью Access 2007 DB:

select 
Specs.SpecName AS TableName,
Columns.FieldName
from
MSysIMEXColumns Columns
inner join MSysIMEXSpecs Specs on Specs.SpecID = Columns.SpecID
order by
Specs.SpecName,
Columns.FieldName

Ответ 6

Быстрый и грязный метод включает Excel. Выполните следующие действия:

  • Откройте таблицу в представлении Datasheet.
  • Экспорт в файл Excel с использованием конкретной процедуры для вашей версии Access.
  • Откройте файл Excel (если он еще не открыт).
  • Выберите и скопируйте первую строку, содержащую заголовки.
  • Добавить другой лист в книгу (если таковой не существует).
  • Нажмите A1.
  • Специальная вставкa > Транспонирование

Поля будут вставлены в один столбец. Чтобы узнать номер своего Индекса полей, в ячейке B1 введите "0", затем серия заполнится до последней строки номеров полей.

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

Ответ 7

Отдайте это...

    private void Button_OldDDLDump_Click(object sender, EventArgs e)
    {
        string _cnstr = "connectionstringhere";
        OleDbConnection _cn = new OleDbConnection(_cnstr);
        try
        {
            _cn.Open();
            System.Data.DataTable _dt = null;            
            try
            {
                _dt = _cn.GetSchema("tables");
                m_msghelper.AppendArray( DataTableHelper.DataTableToString(_dt) );                               
            }
            catch (Exception _ex)
            {
                System.Diagnostics.Debug.WriteLine(_ex.ToString());
            }
            finally
            {
                _dt.Dispose();
            }
        }
        catch (Exception _ex)
        {
            System.Diagnostics.Debug.WriteLine(_ex.ToString());
        }
        finally
        {
            _cn.Close();
        }
    }

Вспомогательный метод для вывода структуры базы данных в массив строк здесь.

public static class DataTableHelper
{
    public static string[] DataTableToString( System.Data.DataTable dt )
    {
        List<string> _retval = new List<string>();

        foreach (System.Data.DataRow row in dt.Rows)
        {
            foreach (System.Data.DataColumn col in dt.Columns)
            {
                _retval.Add( string.Format("{0} = {1}", col.ColumnName, row[col]) );
            }
            _retval.Add( "============================");
        }
        return _retval.ToArray();
    }
}

Ответ 8

Я хотел бы поделиться этим решением VBA, которое я не написал, только слегка измененным (изменилось имя таблицы для использования "SourceTable" ). После запуска вы можете запросить созданную таблицу. Он использует скрытые системные таблицы.

Sub GetField2Description()
'************************************************* *********
'Purpose: 1) Deletes and recreates a table (tblFields)
' 2) Queries table MSysObjects to return names of
' all tables in the database
' 3) Populates tblFields
'Coded by: raskew
'Inputs: From debug window:
' Call GetField2Description
'Output: See tblFields
'************************************************* *********
Dim db As DAO.Database, td As TableDef
Dim rs As Recordset, rs2 As Recordset
Dim Test As String, NameHold As String
Dim typehold As String, SizeHold As String
Dim fielddescription As String, tName As String
Dim n As Long, i As Long
Dim fld As Field, strSQL As String
n = 0
Set db = CurrentDb
' Trap for any errors.
On Error Resume Next
tName = "tblFields"
'Does table "tblFields" exist? If true, delete it;
DoCmd.SetWarnings False
DoCmd.DeleteObject acTable, "tblFields"
DoCmd.SetWarnings True
'End If
'Create new tblTable
    db.Execute     "CREATE TABLE tblFields(Object TEXT (55), FieldName TEXT (55),     FieldType TEXT (20), FieldSize Long, FieldAttributes Long, FldDescription TEXT (20));"
strSQL = "SELECT MSysObjects.Name, MSysObjects.Type From MsysObjects WHERE"
strSQL = strSQL + "((MSysObjects.Type)=1)"
strSQL = strSQL + "ORDER BY MSysObjects.Name;"
Set rs = db.OpenRecordset(strSQL)
If Not rs.BOF Then
' Get number of records in recordset
rs.MoveLast
n = rs.RecordCount
rs.MoveFirst
End If
Set rs2 = db.OpenRecordset("tblFields")
For i = 0 To n - 1
fielddescription = " "
Set td = db.TableDefs(i)
'Skip over any MSys objects
If Left(rs!Name, 4) <> "MSys" And Left(rs!Name, 1) <> "~" Then
NameHold = rs!Name
On Error Resume Next
For Each fld In td.Fields
tableName = fld.SourceTable

fielddescription = fld.Name
typehold = FieldType(fld.Type)
SizeHold = fld.Size
rs2.AddNew
rs2!Object = tableName
rs2!FieldName = fielddescription
rs2!FieldType = typehold
rs2!FieldSize = SizeHold
rs2!FieldAttributes = fld.Attributes
rs2!FldDescription = fld.Properties("description")
rs2.Update
Next fld
Resume Next
End If
rs.MoveNext
Next i
rs.Close
rs2.Close
db.Close
End Sub
Function FieldType(intType As Integer) As String
Select Case intType
Case dbBoolean
FieldType = "dbBoolean" '1
Case dbByte
FieldType = "dbByte" '2
Case dbInteger
FieldType = "dbInteger" '3
Case dbLong
FieldType = "dbLong" '4
Case dbCurrency
FieldType = "dbCurrency" '5
Case dbSingle
FieldType = "dbSingle" '6
Case dbDouble
FieldType = "dbDouble" '7
Case dbDate
FieldType = "dbDate" '8
Case dbBinary
FieldType = "dbBinary" '9
Case dbText
FieldType = "dbText" '10
Case dbLongBinary
FieldType = "dbLongBinary" '11
Case dbMemo
FieldType = "dbMemo" '12
Case dbGUID
FieldType = "dbGUID" '15
End Select
End Function

Ответ 9

Это не SQL, но этот вопрос является лучшим результатом Google для кого-то вроде меня, которому просто нужно перечислять имена полей, необходимые для выбора запроса, поскольку Access не поддерживает "* кроме foo, bar" для получения 99 % таблицы.

Ответ адаптирован из ответа social.msdn.com Патрика Вуда, Access MVP https://social.msdn.microsoft.com/Forums/office/en-US/1fe5546b-db3f-4e17-9bf8-04f4dee233b7/how-to-list-all-the-field-names-in-a-specified-table?forum=accessdev

Измените имя табуляции на свое имя в модуле. Эта функция должна находиться на глобальном уровне:

Function ListTdfFields()
    ' NOT doing DIMs, since then you must enable/attach ADODB or DAO
    ' Dim db As ADO.Database
    Set db = CurrentDb
    tablename = "tblProductLicense"  ' <=== YOUR TABLE NAME HERE
    Set tdf = db.TableDefs(tablename)
    For Each fld In tdf.Fields
        Debug.Print tablename; ".["; fld.Name; "]," ; 
        ' remove ending ; for 1 line per field
    Next
    Debug.Print ""
    Set tdf = Nothing
    Set db = Nothing
End Function

Затем добавьте макрос RunCode ListTdfFields() и запустите его. Вывод будет отправлен в окно Immediate для проектного представления VBA для модуля.

Ответ 10

Запрос на сборку:

SELECT Table_Name.*
FROM Table_Name
WHERE False;

Экспорт в Excel Вы будете иметь каждое имя поля в одной строке без каких-либо данных. Если вы выберете строку и скопируете, вы можете вставить специальное> транспонирование и поместить их все в один столбец.

Ответ 11

Уже есть несколько хороших ответов, но я решил добавить свой собственный поворот. Надеюсь, они говорят сами за себя.

Использование:

  • getFieldNames (TableName: = "Table1", IncludeBrackets: = True, Разделитель = vbNewLine, CopyToClipboard: = True)
  • getFieldNames (TableName: = "Table1", IncludeBrackets: = True, CopyToClipboard: = True)
  • getFieldNames (TableName: = "Table1", IncludeBrackets: = True)
  • getFieldNames (TableName: = "Таблица1")

Я использую это для создания массива имен полей:

  • Chr (34) & getFieldNames (TableName: = "Table1", IncludeBrackets: = False, Разделитель: = Chr (34) & "," & Chr (34)) & Chr (34)

Function getFieldNames(ByVal TableName As String, Optional ByVal IncludeBrackets As Boolean, Optional ByVal Delimiter As String = ", ", Optional ByVal CopyToClipboard As Boolean) As String
    Dim rs As DAO.Recordset

    On Error Resume Next
    Set rs = CurrentDb.OpenRecordset(TableName)
    On Error GoTo 0

    If rs Is Nothing Then Exit Function

    Dim results() As String
    ReDim results(rs.Fields.Count - 1)

    Dim n As Long
    For n = 0 To rs.Fields.Count - 1
        results(n) = rs.Fields(n).Name
    Next
    rs.Close

    Dim result As String
    If IncludeBrackets Then
        result = "[" & Join(results, "]" & Delimiter & "[") & "]"
    Else
        result = Join(results, Delimiter)
    End If


    If CopyToClipboard Then
        With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
            .SetText result
            .PutInClipboard
        End With
    End If

    getFieldNames = result
End Function

Ответ 12

Вы можете использовать Adox в качестве библиотеки метаданных

Ответ 13

выберите column_name из information_schema.columns где table_name = 'table'