如何在遍历 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));
这是我的代码:
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));