如何从MS Access数据库获取表名?

时间:2008-10-14 14:04:09

标签: ms-access

Microsoft SQL Server和MySQL有一个我可以查询的INFORMATION_SCHEMA表。但是,它在MS Access数据库中不存在。

我可以使用等效物吗?

8 个答案:

答案 0 :(得分:57)

以Ilya的答案为基础,尝试以下查询:

SELECT MSysObjects.Name AS table_name
FROM MSysObjects
WHERE (((Left([Name],1))<>"~") 
        AND ((Left([Name],4))<>"MSys") 
        AND ((MSysObjects.Type) In (1,4,6)))
order by MSysObjects.Name 

(这个没有使用MDB进行修改)

ACCDB用户可能需要做这样的事情

SELECT MSysObjects.Name AS table_name
FROM MSysObjects
WHERE (((Left([Name],1))<>"~") 
        AND ((Left([Name],4))<>"MSys") 
        AND ((MSysObjects.Type) In (1,4,6))
        AND ((MSysObjects.Flags)=0))
order by MSysObjects.Name 

因为有一个额外的表,它似乎是某种系统表。

答案 1 :(得分:9)

您可以在Access中使用模式。

Sub ListAccessTables2(strDBPath)
   Dim cnnDB As ADODB.Connection
   Dim rstList As ADODB.Recordset

   Set cnnDB = New ADODB.Connection

   ' Open the connection.
   With cnnDB
      .Provider = "Microsoft.Jet.OLEDB.4.0"
      .Open strDBPath
   End With

   ' Open the tables schema rowset.
   Set rstList = cnnDB.OpenSchema(adSchemaTables)

   ' Loop through the results and print the
   ' names and types in the Immediate pane.
   With rstList
      Do While Not .EOF
         If .Fields("TABLE_TYPE") <> "VIEW" Then
            Debug.Print .Fields("TABLE_NAME") & vbTab & _
               .Fields("TABLE_TYPE")
         End If
         .MoveNext
      Loop
   End With
   cnnDB.Close
   Set cnnDB = Nothing
End Sub

来自:http://msdn.microsoft.com/en-us/library/aa165325(office.10).aspx

答案 2 :(得分:5)

以下是使用数据访问对象(DAO)在Access 2010 VBA中运行的更新答案。表的名称保存在TableDef.Name中。所有表定义的集合都保存在TableDefs中。以下是循环表名称的快速示例:

Dim db as Database
Dim td as TableDef
Set db = CurrentDb()
For Each td In db.TableDefs
  YourSubTakingTableName(td.Name)
Next td

答案 3 :(得分:2)

可以通过OLE DB提供程序为Jet / ACE引擎(我假设您的意思是“访问”)获取与SQL-92 INFORMATION_SCHEMA非常接近的架构信息。

请参阅:

OpenSchema Method (ADO)

Supported Schema Rowsets

答案 4 :(得分:1)

获取表格列表:

SELECT 
    Table_Name = Name, 
FROM 
    MSysObjects 
WHERE 
    (Left([Name],1)<>"~") 
    AND (Left([Name],4) <> "MSys") 
    AND ([Type] In (1, 4, 6)) 
ORDER BY 
    Name

答案 5 :(得分:0)

SELECT 
Name 
FROM 
MSysObjects 
WHERE 
(Left([Name],1)<>"~") 
AND (Left([Name],4) <> "MSys") 
AND ([Type] In (1, 4, 6)) 
ORDER BY 
Name

答案 6 :(得分:0)

最好不要乱用msysObjects(恕我直言)。

{{1}}

答案 7 :(得分:0)

我需要稍微修改 BIBD 发布的 SQL(需要通过在 from 子句中将 sys. 添加到 MSysObjects 来完全保证表名的质量。

        String sqlString = "";
        sqlString += "SELECT MSysObjects.Name AS table_name \n";
        sqlString += "FROM sys.MSysObjects \n";
        sqlString += "WHERE (((Left([Name],1))<>\"~\")  \n";
        sqlString += "        AND ((Left([Name],4))<>\"MSys\")  \n";
        sqlString += "        AND ((MSysObjects.Type) In (1,4,6)) \n";
        sqlString += "        AND ((MSysObjects.Flags)=0)) \n";
        sqlString += "order by MSysObjects.Name \n";

完整的工作示例可在 https://github.com/NACHC-CAD/access-to-csv-tool 获得。此示例还显示了使用 jdbc 连接到 MS Access 数据库并使用 Apache Commons CSV 将所有表导出为 csv。