2012-07-18 21 views
7

MS Accessテーブルにすべてのフィールド名をリストすることが可能かどうか教えてください。SQLでアクセスするテーブルのフィールド名をリストする方法

ありがとう

+0

あなたはSQLを参照しているので、Select object_Name(object_ID)、Pastries.SQL_Modules の定義(object_Name(object_ID)= 'custard')のようなSQL Serverに似たことをしたいことがあります。 Accessはこのようなオブジェクトの可視性を提供していないと私は思います。 – Smandoli

答えて

2

Documenterツールを使用するだけで簡単に使用できます。 Database Tools > Database Documenterに移動し、テーブルを選択して[OK]を押します。

+1

質問にはSQLがあります。 – Fionnuala

+0

私はあなたに同意することができます。とにかく答えが役立つかもしれないと感じました。おそらく最高の考え方ではないでしょう。 – Smandoli

+0

それは最高の質問ではありません、私は思う: – Fionnuala

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 SQLの(多分名目上の)使用、とはるかに多くのMS Accessで働いたことの間違いない証拠。 – Smandoli

+1

アクセスは必ずしも必要なツールではありませんが、しばしばあなたが持っているツールです。 Access 2013でこれを適用する際の注意点:私は 'Tools' - >' References'で 'Microsoft ActiveX Data Objects 6.1 Library'を有効にしてADOライブラリを解決しなければなりませんでした。 – StockB

+0

@John Bingham - ちょうどAccessDBに悩まされていて、これを見ていなければならなかった - それは私をいくつかの刺激から、おそらくいくらかの落ち込んでいる思考からも救った:)ありがとう! – SlimsGhost

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

私が見ていたテーブルにインポート仕様が設定されているので、おそらく私の結果にだまされていました。私が言ったように、この仕事は昔のほうが簡単だったようです。しかたがない。 –

0

すばやく汚い方法にはExcelが関係します。次の操作を実行します。

  1. テーブルをデータシートビューで開きます。
  2. Accessバージョンの特定の手順を使用してExcelファイルにエクスポートします。
  3. Excelファイルを開きます(まだ開いていない場合)。
  4. ヘッダーを含む最初の行を選択してコピーします。
  5. 別のシートをブックに追加します(存在しない場合)。
  6. A1をクリックします。
  7. して貼り付け>フィールドが1列に貼り付けられます

トランスポーズ。フィールドインデックス番号を調べるには、セルB1に「0」と入力します。フィールドの最後の行まで入力します。

さらに、特に数十のフィールドを含むレガシーフラットファイルの場合、アルファベット順に列をソートできます。これは、フラットファイルをリレーショナルモデルに変換しようとすると、実際には時間が大幅に節約されます。

4

このバージョンは簡単に実行でき、Accessにペーストされます。F5で実行モジュールにこの機能を追加し、InputBox関数から結果をコピーします。

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 

代替出力:1024文字の制限を克服するためにInputBox関数に代わるものを提供user1003916

ユーザー(私は)まだこれをテストしていません:

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やメモ帳にコピーするだけです。++ – Shai

+0

良い点、Shai。私は最後のダイアログに少しのテキストを追加したので、あまり混乱させることはありません。 –

+0

偉大なスクリプトですが、ここでは1024文字の制限があります。長い列名がある場合は、それらを切り捨てます。私のテーブルには255のカラムがあり、それは約半分にしかなりませんでした。 – user1003916

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

ここでは文字列配列にデータベース構造をダンプするためのヘルパーメソッド..

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

選択したcolumn_name information_schema.columns TABLE_NAME = 'テーブル' から

+3

これは動作しません。これはMS SQLまたはおそらくMySQLでは動作しますが、Accessでは動作しません。これがうまくいくならば素晴らしいだろう。 – DHW

1

UPDATE:作業を行う必要があり、このSQLクエリを使用しますDBEAVERなどのツールを使用します。 アクセスクライアントは、隠された構造を調べることを許可しません。

YIKES! IMO:I SQLによってアクセス表の列を取得する方法VBA

の暗い下腹部に飛び込むしたいと想像することはできません
SELECT * FROM information_schema.columns 
    WHERE TABLE_NAME="YOUR_TABLE_NAME" 
     AND 
    TABLE_SCHEMA="PUBLIC" 

私はアクセスが

以上

「PUBLIC」私のスキーマと呼ばれて気づいたPS Access 2016を使用し、ODBCおよびjdbc:ucanaccessでテストされ、魅力的に動作します。

出力例は

Screen shot of column names

+0

このアイデアが投票された理由がわかりません。この手法はうまくいきます。 –

+0

私はこれを私のテーブル名などで照会ウィンドウにポップしました。それはファイルinfo_scheme.mdbを見つけることができませんでした。 –

+0

私は1つの重要な指示を忘れてしまったようです。 Accessデータベースでこのクエリを実行するために、Accessクライアントを使用することはできません。代わりに、DBeaverなどのツールを使用する必要があります。私はなぜその質問がAccessで実行されたときにすべての地獄が緩んでいるのか分かりません。同じクエリがdBeaverで実行されたときに、結果が期待どおりに得られる –

0

私は書いていない、このVBAソリューション、わずかに修正を共有したいと思います( 'SourceTable' を使用するtableNameの変更しました)。実行されると、作成したテーブルをクエリできます。隠されたシステムテーブルを利用します。

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ではありませんが、この質問は、単にアクセスがfoo以外*」をサポートしていませんので、選択するクエリに必要なフィールド名をリストする必要があります私のような誰かのために、トップのGoogleの結果である、バー"テーブルの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

変更テーブル名。そして、マクロRUNCODEのListTdfFieldsを(追加

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 

)と、それを実行します。この機能は、グローバルレベルでなければなりません。出力は、モジュールのVBAデザインビューのイミディエイトウィンドウに送信されます。

関連する問題