如何在遍历 SQL smo 中的所有表时仅识别基表?

How can I identify only base tables when iterating through all tables in SQL smo?

这是我的代码:

Server server = new Server(new ServerConnection(con));
server.ConnectionContext.Connect();

foreach (Table table in server.Databases[sqlDatabase].Tables)
{
    if (table <is a base table>)

基本上我认为这也会拉回观点。我用来识别所需表的 SQL 是:

SELECT TABLE_NAME FROM MyDatabase.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

然而,Microsoft.SqlServer.Management.Smo.TableCollection 的结果似乎没有 TABLE_TYPE 属性。根据SQL,TABLE_TYPE要么是BASE TABLE要么是VIEW,所以只有两种可能。

如何只识别表(而不是视图)?

你做的没问题。您可以通过这种方式找到视图 -> WHERE TABLE_TYPE = 'VIEW',因此您的 select 可以按照您的意愿进行操作。我建议您打开管理工作室或任何其他允许您查询数据的程序和 运行 这个:

SELECT * FROM MyDatabase.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
SELECT * FROM MyDatabase.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW'

遍历 TablesCollection 不会枚举视图,因此您的代码应该可以正常工作,而不必担心视图。

您确实有一个 Views 集合 server.Databases[sqlDatabase].Views

并且,在此集合以及表格集合中,您可以使用 属性 IsSystemObject[= 将您自己的 views/tables 与系统 views/tables 区分开来13=]

var myTables = server.Databases[sqlDatabase].Views
                    .Cast<Table> => !v.IsSystemObject));

var myViews = server.Databases[sqlDatabase].Views
                    .Cast<View>().Where(v => !v.IsSystemObject));