Это мой код:
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
, так что только две возможности.
Как определить только таблицы (а не представления)?
Это нормально, что ты сделал. Вы можете найти представления таким образом -> 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'
Цикл по TablesCollection не будет перечислять представления, поэтому ваш код должен работать как есть, не беспокоясь о представлениях.
Действительно, у вас есть коллекция Views как server.Databases[sqlDatabase].Views
И в этой коллекции, как и в коллекции Таблицы, вы можете отличать свои собственные представления/таблицы от системных представлений/таблиц, используя свойство IsSystemObject
var myTables = server.Databases[sqlDatabase].Views
.Cast<Table> => !v.IsSystemObject));
var myViews = server.Databases[sqlDatabase].Views
.Cast<View>().Where(v => !v.IsSystemObject));
Цикл по TablesCollection не будет перечислять представления. Действительно, у вас есть коллекция Views как server.Databases[sqlDatabase].Views