Как определить только базовые таблицы при переборе всех таблиц в SQL? - PullRequest
2 голосов
/ 28 мая 2019

Это мой код:

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, поэтому существует только две возможности.

Как я могу идентифицировать только таблицы (а не представления)?

Ответы [ 2 ]

4 голосов
/ 28 мая 2019

Зацикливание на TablesCollection не будет перечислять Views, поэтому ваш код должен работать как есть, не беспокоясь о Views.

Действительно, у вас есть коллекция 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));
1 голос
/ 28 мая 2019

Ничего страшного, что ты сделал. Вы можете найти просмотры таким образом -> 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...