是否有可能从SQL Server获得数据表列表?

本文关键字:数据表 列表 Server 有可能 SQL 是否 | 更新日期: 2023-09-27 18:19:20

我试图从我的SQL Server数据库获得表的列表。我想要DataTable对象,而不仅仅是name

到目前为止,我得到了:

using (SqlConnection connection = new SqlConnection(Settings.Default.DatabaseString))
{
   List<DataTable> tables = new List<DataTable>();
   connection.Open();       
}

我可以得到表的名称使用:

DataTable schema = connection.GetSchema("Tables");
foreach (DataRow row in schema.Rows)
{
    var name = row[2].ToString();
}

但是我想要更多的信息,而不仅仅是表的名称,我想返回主键和外键等。这可能吗?

是否有可能从SQL Server获得数据表列表?

您可以通过Conenction.GetSchema过载获取有关数据库,表,列和索引的信息:

using (var con = new SqlConnection(Settings.Default.DatabaseString))
{
    con.Open();
    DataTable tables = con.GetSchema("Tables");
    foreach (DataRow tableRow in tables.Rows)
    {
        String database = tableRow.Field<String>("TABLE_CATALOG");
        String schema = tableRow.Field<String>("TABLE_SCHEMA");
        String tableName = tableRow.Field<String>("TABLE_NAME");
        String tableType = tableRow.Field<String>("TABLE_TYPE");
        DataTable columns = con.GetSchema("Columns", new[] { database, null, tableName });
        foreach (DataRow col in columns.Rows)
        {
            Console.WriteLine(string.Join(",",col.ItemArray));
        }
        DataTable indexes = con.GetSchema("Indexes", new[] { database, null, tableName });
        foreach (DataRow index in indexes.Rows)
        {
            Console.WriteLine(string.Join(",", index.ItemArray));
        }
        DataTable indexColumns = con.GetSchema("IndexColumns", new[] { database, null, tableName });
        foreach (DataRow indexCol in indexColumns.Rows)
        {
            Console.WriteLine(string.Join(",", indexCol.ItemArray));
        }
    }
}

以下是GetSchema的可能值列表:

https://msdn.microsoft.com/en-us/library/cc716722 (v = vs.110) . aspx

SQL Server在查询目录方面是非常开放的。您可以轻松地创建将返回所需数据的查询。

存在多个表来帮助您:

SELECT * FROM sys.tables
SELECT * FROM sys.columns
SELECT * FROM sys.indexes
SELECT * FROM sys.objects o WHERE o.type IN ('PK', 'F')

从这些表中查询对象的名称可以通过系统方法OBJECT_NAME完成。