2

这是我的代码:

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'

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

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

4

2 回答 2

4

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

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

而且,在这个集合以及 Tables 集合中,您可以使用属性将您自己的视图/表与系统视图/表区分开来IsSystemObject

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

var myViews = server.Databases[sqlDatabase].Views
                    .Cast<View>().Where(v => !v.IsSystemObject));
于 2019-05-28T09:59:49.710 回答
1

没关系,你做了什么。你可以通过这种方式找到视图 -> WHERE TABLE_TYPE = 'VIEW',所以你的选择做你想做的事。我建议您打开管理工作室或任何其他允许您查询数据并运行它的程序:

SELECT * FROM MyDatabase.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
SELECT * FROM MyDatabase.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW'
于 2019-05-28T09:39:23.033 回答