Подскажите, пожалуйста, можно ли перечислить все имена полей в таблице MS Access?
Как указать имя поля в таблице в Access с использованием SQL
Ответ 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'