答えて
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 SQLの(多分名目上の)使用、とはるかに多くのMS Accessで働いたことの間違いない証拠。 – Smandoli
アクセスは必ずしも必要なツールではありませんが、しばしばあなたが持っているツールです。 Access 2013でこれを適用する際の注意点:私は 'Tools' - >' References'で 'Microsoft ActiveX Data Objects 6.1 Library'を有効にしてADOライブラリを解決しなければなりませんでした。 – StockB
@John Bingham - ちょうどAccessDBに悩まされていて、これを見ていなければならなかった - それは私をいくつかの刺激から、おそらくいくらかの落ち込んでいる思考からも救った:)ありがとう! – SlimsGhost
このタスクのように思われるのは、古い頃です。この回答は、バージョンによって大きく異なる可能性があります。それは私のために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
私が見ていたテーブルにインポート仕様が設定されているので、おそらく私の結果にだまされていました。私が言ったように、この仕事は昔のほうが簡単だったようです。しかたがない。 –
すばやく汚い方法にはExcelが関係します。次の操作を実行します。
- テーブルをデータシートビューで開きます。
- Accessバージョンの特定の手順を使用してExcelファイルにエクスポートします。
- Excelファイルを開きます(まだ開いていない場合)。
- ヘッダーを含む最初の行を選択してコピーします。
- 別のシートをブックに追加します(存在しない場合)。
- A1をクリックします。
- して貼り付け>フィールドが1列に貼り付けられます
トランスポーズ。フィールドインデックス番号を調べるには、セルB1に「0」と入力します。フィールドの最後の行まで入力します。
さらに、特に数十のフィールドを含むレガシーフラットファイルの場合、アルファベット順に列をソートできます。これは、フラットファイルをリレーショナルモデルに変換しようとすると、実際には時間が大幅に節約されます。
このバージョンは簡単に実行でき、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
素晴らしい作品です。あなたが入力したテーブルのすべてのフィールドを一覧表示します。紛らわしい部分は...小さなテキストボックスに結果を置きます。私はそれが動作していないと思ったが、それは働いていた。ペースト結果をExcelやメモ帳にコピーするだけです。++ – Shai
良い点、Shai。私は最後のダイアログに少しのテキストを追加したので、あまり混乱させることはありません。 –
偉大なスクリプトですが、ここでは1024文字の制限があります。長い列名がある場合は、それらを切り捨てます。私のテーブルには255のカラムがあり、それは約半分にしかなりませんでした。 – user1003916
は、このやってみる...
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();
}
}
選択したcolumn_name information_schema.columns TABLE_NAME = 'テーブル' から
これは動作しません。これはMS SQLまたはおそらくMySQLでは動作しますが、Accessでは動作しません。これがうまくいくならば素晴らしいだろう。 – DHW
UPDATE:作業を行う必要があり、このSQLクエリを使用しますDBEAVERなどのツールを使用します。 アクセスクライアントは、隠された構造を調べることを許可しません。
YIKES! IMO:I SQLによってアクセス表の列を取得する方法VBA
の暗い下腹部に飛び込むしたいと想像することはできません SELECT * FROM information_schema.columns
WHERE TABLE_NAME="YOUR_TABLE_NAME"
AND
TABLE_SCHEMA="PUBLIC"
SELECT * FROM information_schema.columns
WHERE TABLE_NAME="YOUR_TABLE_NAME"
AND
TABLE_SCHEMA="PUBLIC"
私はアクセスが
以上「PUBLIC」私のスキーマと呼ばれて気づいたPS Access 2016を使用し、ODBCおよびjdbc:ucanaccessでテストされ、魅力的に動作します。
出力例は
このアイデアが投票された理由がわかりません。この手法はうまくいきます。 –
私はこれを私のテーブル名などで照会ウィンドウにポップしました。それはファイルinfo_scheme.mdbを見つけることができませんでした。 –
私は1つの重要な指示を忘れてしまったようです。 Accessデータベースでこのクエリを実行するために、Accessクライアントを使用することはできません。代わりに、DBeaverなどのツールを使用する必要があります。私はなぜその質問がAccessで実行されたときにすべての地獄が緩んでいるのか分かりません。同じクエリがdBeaverで実行されたときに、結果が期待どおりに得られる –
私は書いていない、この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
これは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デザインビューのイミディエイトウィンドウに送信されます。
- 1. SQLでのテーブル名とフィールドの重複を避ける方法
- 2. Tempテーブルのテーブル名とフィールド名を使用するSQLカーソル
- 3. リストをテーブル名にキャストする方法
- 4. CakePHPでテーブルのフィールド名を取得する方法
- 5. MariaDB、フィールド名をテーブル名として使用する方法は?
- 6. Sitecore:異なるセクションで同じフィールド名にアクセスする方法
- 7. 名前でドットを持つjsonフィールドにアクセスする方法
- 8. リストSQLフィールドは、MVCのC#で名前
- 9. LINQ to SQLフィールド名で値を取得する方法
- 10. 動的SQLでテーブル名の引数を使用する方法
- 11. sqlでテーブルの名前を変更する方法は?
- 12. 名前でフィールドにアクセスする方法は?
- 13. PL/SQLでテーブル名をプログラムで設定する方法は?
- 14. SQL Developer(toad)でSampleAppLite.rpdのテーブルにアクセスする方法は?
- 15. Laravel 5の外部テーブルのフィールドにアクセスする方法は?
- 16. xmlフィールドをsqlのテーブルに変換する方法は?
- 17. SQL Server 2005のテーブルとフィールドを文書化する方法
- 18. テーブル内のフィールド名を検索する方法server2005
- 19. Laravel 5:hasManyテーブルのフィールドにアクセスする方法は?
- 20. Oracle SQLでテーブル名を具体的に定義する方法
- 21. sqlでテーブル名と1列を取得する方法は?
- 22. PivotCell.RowItem(n)のフィールド名にアクセスする方法は?
- 23. 計算されたフィールドをSQLリストに追加する方法
- 24. 1つのSQL文で2つのデータベースにアクセスする方法(テーブル名、DB名は同じ)OLEDB
- 25. SQLのあるテーブルのフィールドの平均で列を取得する方法
- 26. テーブル内の名前リストを比較する方法
- 27. ElasticSearchですべてのフィールド名のリストを取得する方法は?
- 28. ADODB接続をループしてテーブル名、フィールド名、およびフィールドタイプをリストする方法
- 29. T SQL - SQLテーブルのフィールドまたはカラムからデータを取得する方法
- 30. SQL Server - テーブル名を変更する方法
あなたはSQLを参照しているので、Select object_Name(object_ID)、Pastries.SQL_Modules の定義(object_Name(object_ID)= 'custard')のようなSQL Serverに似たことをしたいことがあります。 Accessはこのようなオブジェクトの可視性を提供していないと私は思います。 – Smandoli