web-dev-qa-db-fra.com

Comment répertorier le nom du champ dans la table dans Access à l'aide de SQL

Pouvez-vous s'il vous plaît laissez-moi savoir s'il est possible de lister tous les noms de champs dans une table MS Access?

Merci

8
Suffii

Je travaille beaucoup trop dans MS Access.

Le seul moyen que je connaisse pour ce faire serait d'utiliser vba et de définir, par exemple, un jeu d'enregistrements et de parcourir en boucle les champs.

Par exemple:

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

La variable chaîne ss contiendra une liste délimitée par des virgules de tous les noms de colonnes de la table nommée "SomeTable".

Avec un peu de reformatage de la logique, vous devriez pouvoir insérer ces données dans une autre table si vous le souhaitez, puis les interroger.

Est-ce que cela aide?

13
John Bingham

Cette version est facile à exécuter et va coller directement dans Access. Ajoutez cette fonction à un module, exécutez-la avec F5 et copiez le résultat depuis la boîte de saisie:

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

Sortie alternative:

L'utilisateur user1003916 a fourni une alternative à la InputBox pour dépasser la limite de 1024 caractères (je ne l'ai pas encore testé):

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
4
Don Jewett

MISE À JOUR: POUR UTILISER CETTE DEMANDE SQL, VOUS DEVEZ UTILISER UN OUTIL TEL QUE DBEAVER . CLIENT D'ACCÈS NE VOUS PERMET PAS D'INTERROULER LES STRUCTURES CACHÉES

YIKES! IMO: Je ne peux pas imaginer vouloir plonger dans le ventre sombre de VBA

Comment obtenir des colonnes de table Access par SQL

SELECT * FROM information_schema.columns 
    WHERE TABLE_NAME="YOUR_TABLE_NAME" 
       AND 
    TABLE_SCHEMA="PUBLIC" 

PS j'ai remarqué Access appelé mon schéma "PUBLIC"

Above a utilisé un Access 2016 et a été testé sur ODBC et jdbc: ucanaccess et fonctionne à merveille.

Exemple de sortie

 Screen shot of column names

3
David Lundquist

Vous pouvez simplement utiliser l'outil Documenter. Allez à Database Tools > Database Documenter, sélectionnez le tableau et appuyez sur OK.

1
Smandoli

Construire la requête:

SELECT Table_Name.*
FROM Table_Name
WHERE False;

Exporter vers ExcelVous aurez chaque nom de champ dans une ligne sans aucune donnée. Si vous sélectionnez la ligne et la copie, vous pouvez coller spécial> transposer et les placer tous dans une seule colonne.

0
Yee Haw

Une méthode rapide et sale implique Excel. Faites ce qui suit:

  1. Ouvrez la table en mode Feuille de données.
  2. Exporter vers un fichier Excel, en utilisant la procédure particulière pour votre version d'Access. 
  3. Ouvrir le fichier Excel (si pas déjà ouvert). 
  4. Sélectionnez et copiez la première ligne contenant les en-têtes.
  5. Ajoutez une autre feuille au classeur (s'il n'en existe aucune).
  6. Cliquez sur A1.
  7. Collage spécial> Transposer

Les champs seront collés dans une seule colonne. Pour connaître leur numéro d'index de champ, entrez "0" dans la cellule B1, puis remplissez la série jusqu'à la dernière ligne du numéro de champ.

En outre, vous pouvez trier la colonne par ordre alphabétique, en particulier pour les fichiers plats hérités contenant des dizaines de champs. Cela économise vraiment beaucoup de temps lorsque j'essaie de convertir un fichier à plat en un modèle relationnel.

0
Michael Reese

Laisse ça aller ...

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

Méthode d'assistance pour vider la structure de la base de données dans un tableau de chaînes ici.

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

On dirait que cette tâche était plus facile dans les vieux jours. Il est probable que cette réponse dépend fortement de la version. Cela fonctionne pour moi dans un test rapide avec une base de données Access 2007:

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
andy holaday

Ce n'est pas du SQL, mais cette question est le premier résultat de Google pour quelqu'un comme moi qui n'a besoin que de répertorier les noms de champs nécessaires à la sélection d'une requête, car Access ne prend pas en charge "* sauf foo, bar" pour obtenir 99% des réponses. table.

Réponse adaptée d'une réponse social.msdn.com de Patrick Wood, MVP Access https://social.msdn.Microsoft.com/Forums/office/en-US/1fe5546b-db3f-4e17-9bf8-04f4dee233b7/comment-lister-tous-les-noms-de-champs-dans-une-table-spécifiée? forum = accessdev

Changez le nom de table en votre nom dans le module. Cette fonction devrait être au niveau global:

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

Ajoutez ensuite une macro RunCode ListTdfFields () et exécutez-la. La sortie sera envoyée à la fenêtre Immediate de la vue de conception VBA du module.

0
Dave S

J'aimerais partager cette solution VBA, que je n'ai pas écrite, mais légèrement modifiée (le nom de la table a été remplacé par "SourceTable"). Une fois qu'il est exécuté, vous pouvez interroger la table créée. Il tire parti des tables système cachées.

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
Pertinent Info