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

时间:2019-05-28 09:35:41

标签: c# sql-server 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'

但是,结果TABLE_TYPE上似乎没有Microsoft.SqlServer.Management.Smo.TableCollection属性。根据SQL,TABLE_TYPE为BASE TABLEVIEW,因此只有两种可能。

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

2 个答案:

答案 0 :(得分:4)

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

实际上,您有一个server.Databases[sqlDatabase].Views的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));

答案 1 :(得分:1)

你做的没关系。您可以通过这种方式找到视图-> WHERE TABLE_TYPE = 'VIEW',以便您选择执行所需的操作。我建议您打开Management Studio或任何其他允许您查询数据并运行此程序的程序:

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