这是我的代码:
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
,因此只有两种可能。
如何仅识别表(而不识别视图)?
答案 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'