2012-07-18 91 views
7

如果可以列出MS Access表中的所有字段名稱,請讓我知道嗎?如何在訪問表中使用SQL列出字段名稱

謝謝

+0

由於您引用了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

回答

2

您可以簡單地使用Documenter工具。轉至Database Tools > Database Documenter,選擇表格並按OK。

+1

這個問題說SQL。 – Fionnuala 2012-07-18 19:45:32

+0

我只能在那裏同意你的看法。無論如何,感覺答案可能會有所幫助。可能不是最好的想法。 – Smandoli 2012-07-18 19:49:18

+0

這不是最好的問題,我認爲:) – Fionnuala 2012-07-18 19:53:19

12

我在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」表中的所有列名的列表。

對邏輯進行一些重新格式化後,如果需要,可以將這些數據插入到另一個表中,然後將其查詢出來。

這有幫助嗎?

+6

Upvote for(或許有點名義上的)使用SQL,加上在MS Access中工作太多的明確證據。 – Smandoli 2012-07-19 12:44:32

+1

訪問並不總是您需要的工具,但它通常是您擁有的工具。關於在Access 2013中應用這一點的說明:我必須在'Tools' - >'References'中啓用'Microsoft ActiveX Data Objects 6.1 Library'來解析ADO庫。 – StockB 2016-10-17 15:08:47

+0

@John Bingham - 剛剛被一個AccessDB卡住了,不得不來看看這個 - 它讓我從一些煩惱中解救出來了,也許還有一些令人沮喪的想法:)謝謝! – SlimsGhost 2017-02-01 18:26:42

0

似乎這個任務在以前的日子更容易。有可能這個答案是高度依賴於版本的。它適用於對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 
+0

啊,我可能被我的結果愚弄了,因爲我在我看到的表格上設置了導入規格。就像我說的,似乎這個任務在過去的日子裏更容易。好吧。 – 2012-07-19 03:01:24

0

一種快速而髒的方法涉及Excel。請執行以下操作:

  1. 在數據表視圖中打開表格。
  2. 導出到Excel文件,使用Access版本的特定過程。
  3. 打開Excel文件(如果尚未打開)。
  4. 選擇並複製包含標題的第一行。
  5. 將另一張紙添加到工作簿(如果不存在)。
  6. 點擊A1。
  7. 粘貼特殊>移調

字段將在單個列中被粘貼。要找到他們的字段索引號,在單元格B1中鍵入「0」,然後系列填充到字段號的最後一行。

此外,您可以按字母順序對列進行排序,尤其是對於涉及數十個字段的傳統平面文件。當我試圖將平面文件轉換爲關係模型時,這確實節省了大量時間。

4

這個版本很容易運行,並且會直接粘貼到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 
+0

工程很棒。它列出了您輸入的任何表格的所有字段。只有混淆的部分是......它將結果放入那個小文本框中。我認爲這是行不通的,但它工作。只需要將粘貼結果複製到Excel或Notepad ++ – Shai 2015-06-19 18:37:05

+0

好點,Shai。我在最後一個對話框中添加了一些文本,所以它不會令人困惑。 – 2015-06-20 23:19:20

+0

偉大的腳本,但請記住這裏有1024個字符的限制。如果你有很多長列名,它會截斷它們。我的桌子有255列,只佔了大約一半。 – user1003916 2016-09-12 18:20:15

0

給這個一展身手......

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(); 
    } 
} 
-2

從INFORMATION_SCHEMA.COLUMNS選擇列名在表格名=「表」

+3

這不起作用。這將適用於MS SQL或MySQL,但不適用於Access。如果這會工作,但會很棒。 – DHW 2016-08-06 18:21:46

1

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進行了測試,並且像魅力一樣工作。

實施例輸出

Screen shot of column names

+0

不確定爲什麼這個想法被拒絕了。該技術運作良好。 – 2017-04-14 18:46:38

+0

我彈出這個到我的表名等查詢窗口,它說找不到文件information_scheme.mdb – 2017-04-14 19:51:49

+0

我很抱歉,似乎我忘了一個重要的指令。您不能使用Access客戶端在Access數據庫上執行此查詢。相反,您必須使用諸如DBeaver之類的工具。我不知道爲什麼,但是當查詢在Access中運行時,所有的地獄都會崩潰。當在dBeaver中運行相同的查詢時,您會得到預期的結果 – 2017-04-16 00:40:58

0

我想共享此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 
0

這不是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設計視圖的立即窗口。

相關問題