回答
我在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」表中的所有列名的列表。
對邏輯進行一些重新格式化後,如果需要,可以將這些數據插入到另一個表中,然後將其查詢出來。
這有幫助嗎?
Upvote for(或許有點名義上的)使用SQL,加上在MS Access中工作太多的明確證據。 – Smandoli 2012-07-19 12:44:32
訪問並不總是您需要的工具,但它通常是您擁有的工具。關於在Access 2013中應用這一點的說明:我必須在'Tools' - >'References'中啓用'Microsoft ActiveX Data Objects 6.1 Library'來解析ADO庫。 – StockB 2016-10-17 15:08:47
@John Bingham - 剛剛被一個AccessDB卡住了,不得不來看看這個 - 它讓我從一些煩惱中解救出來了,也許還有一些令人沮喪的想法:)謝謝! – SlimsGhost 2017-02-01 18:26:42
似乎這個任務在以前的日子更容易。有可能這個答案是高度依賴於版本的。它適用於對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
啊,我可能被我的結果愚弄了,因爲我在我看到的表格上設置了導入規格。就像我說的,似乎這個任務在過去的日子裏更容易。好吧。 – 2012-07-19 03:01:24
一種快速而髒的方法涉及Excel。請執行以下操作:
- 在數據表視圖中打開表格。
- 導出到Excel文件,使用Access版本的特定過程。
- 打開Excel文件(如果尚未打開)。
- 選擇並複製包含標題的第一行。
- 將另一張紙添加到工作簿(如果不存在)。
- 點擊A1。
- 粘貼特殊>移調
字段將在單個列中被粘貼。要找到他們的字段索引號,在單元格B1中鍵入「0」,然後系列填充到字段號的最後一行。
此外,您可以按字母順序對列進行排序,尤其是對於涉及數十個字段的傳統平面文件。當我試圖將平面文件轉換爲關係模型時,這確實節省了大量時間。
這個版本很容易運行,並且會直接粘貼到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
工程很棒。它列出了您輸入的任何表格的所有字段。只有混淆的部分是......它將結果放入那個小文本框中。我認爲這是行不通的,但它工作。只需要將粘貼結果複製到Excel或Notepad ++ – Shai 2015-06-19 18:37:05
好點,Shai。我在最後一個對話框中添加了一些文本,所以它不會令人困惑。 – 2015-06-20 23:19:20
偉大的腳本,但請記住這裏有1024個字符的限制。如果你有很多長列名,它會截斷它們。我的桌子有255列,只佔了大約一半。 – user1003916 2016-09-12 18:20:15
給這個一展身手......
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();
}
}
Helper方法轉儲數據庫結構,以一個字符串數組這裏..
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();
}
}
從INFORMATION_SCHEMA.COLUMNS選擇列名在表格名=「表」
這不起作用。這將適用於MS SQL或MySQL,但不適用於Access。如果這會工作,但會很棒。 – DHW 2016-08-06 18:21:46
UPDATE:要使用此SQL查詢必須使用工具如DBEAVER。 訪問客戶不會允許您查看其隱藏的結構。
YIKES! IMO:我無法想象想要潛入VBA
的黑暗軟肋如何通過SQL獲得訪問表的列
SELECT * FROM information_schema.columns
WHERE TABLE_NAME="YOUR_TABLE_NAME"
AND
TABLE_SCHEMA="PUBLIC"
PS我發現訪問打電話給我的模式「PUBLIC」
以上使用Access 2016,並通過ODBC和jdbc:ucanaccess進行了測試,並且像魅力一樣工作。
實施例輸出
不確定爲什麼這個想法被拒絕了。該技術運作良好。 – 2017-04-14 18:46:38
我彈出這個到我的表名等查詢窗口,它說找不到文件information_scheme.mdb – 2017-04-14 19:51:49
我很抱歉,似乎我忘了一個重要的指令。您不能使用Access客戶端在Access數據庫上執行此查詢。相反,您必須使用諸如DBeaver之類的工具。我不知道爲什麼,但是當查詢在Access中運行時,所有的地獄都會崩潰。當在dBeaver中運行相同的查詢時,您會得到預期的結果 – 2017-04-16 00:40:58
我想共享此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
這不是SQL,但是這個問題是頂級的谷歌的結果對於像我這樣誰只需要列出需要查詢的字段名稱來選擇,因爲Access不支持「*除foo之外,酒吧「獲得99%的桌子。
答案由帕特里克·伍德改編自social.msdn.com答案,訪問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()並運行它。輸出將被髮送到模塊的VBA設計視圖的立即窗口。
- 1. ng-repeat:如何訪問字段名稱
- 2. 如何使用列表中的名稱訪問數據幀列
- 3. Textbox字段名稱訪問
- 4. 如何使用JSTL sql訪問重複的列名稱?
- 5. 如何在Django中訪問ModelForm的字段名稱?
- 6. 訪問列表名稱
- 7. 如何使用字段名稱的變量訪問namedtuple的字段?
- 8. 使用'。'訪問pandas.DataFrame列名稱。在它
- 9. IDL:使用存儲在變量中的字段名稱訪問結構字段?
- 10. 如何通過VBA在字段名稱中使用帶點的方式導出訪問CSV表格?
- 11. 當字段名稱在變量中時,如何訪問類的字段?
- 12. 如何在SQL中使用數字作爲列名稱?
- 13. 如何列出表單的字段名稱
- 14. 如何在列表中循環並訪問名稱和屬性?
- 15. MapRoute如何訪問匿名類型的字段名稱?
- 16. Drupal 7:如何訪問PHP中的計算機名稱字段?
- 17. 如何在第三級訪問componentlink字段名稱?
- 18. 如何在運行時按名稱訪問結構字段?
- 19. 以唯一名稱訪問SSRS字段
- 20. 訪問變量字段名稱
- 21. 如何在圖的名稱中使用列表名稱?
- 22. 在視圖中使用列名稱中的空格訪問列
- 23. SQL datareader字段名稱超出範圍
- 24. 破折號訪問數據庫表中的字段名稱
- 25. Python:在字符串中通過名稱訪問結構字段
- 26. 如何使用Linq訪問Sharepoint列表的是/否字段?
- 27. 如何使用名稱列表中VXML
- 28. SQL問題 - 多個MySQL表中的相同字段名稱?
- 29. 使用SQL獲取Microsoft Access表中的所有字段名稱使用SQL
- 30. SQL如何使用表名從表中選擇特定字段
由於您引用了SQL,因此您可能希望像SQL Server那樣執行類似於'Select object_Name(object_ID)'的操作,從Pastries.SQL_Modules where object_Name(object_ID)='custard''定義。我相信Access不提供這種對象可見性。 – Smandoli 2012-07-18 20:34:49