Как определить только базовые таблицы при переборе всех таблиц в SQL?
Это мой код:
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 ответа
Циклы над TablesCollection не будут перечислять Views, поэтому ваш код должен работать как есть, не беспокоясь о 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));
Это нормально, что ты сделал. Вы можете найти виды таким образом -> 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'