2015-06-05 3 views
1

Я знаю, что могу найти таблицу Rowcount с помощью SMO, но мне не удается получить представление Rowcount .. Мне действительно не нужна точная строка (это бонус), но мне нужно знать, является ли представление «пустым» "(0 записей).Использование объектов управления Sql (SMO) для подключения к SQL, как узнать, имеет ли представление какие-либо строки?

Вот моя попытка до сих пор:

public Int64 GetRowCount() 
{ 
    SqlConnection sqlConnection = new SqlConnection(SqlConnectionString); 
    ServerConnection serverConnection = new ServerConnection(sqlConnection); 
    Server server = new Server(serverConnection); 
    if (server == null) 
     throw new InvalidDataException(
      string.Format(
       "Could not connect to server {0}. Check that it exists and that the current user has access to it.", 
       SqlServerName)); 
    Database db = server.Databases[SqlDatabaseName]; 
    if (db == null) 
     throw new InvalidDataException(
      string.Format(
       "Could not connect to database {0} on server {1}. Check that it exists and that the current user has access to it.", 
       SqlDatabaseName, SqlServerName)); 

    db.DefaultSchema = SqlSchemaName; 

    if (db.Tables.Contains(SqlTableName)) 
    { 
     Table tbl = db.Tables[SqlTableName]; 
     return tbl.RowCount; 
    } 
    if (db.Views.Contains(SqlTableName)) 
    { 
     View view = db.Views[SqlTableName]; 
     try 
     { 
      view.ReCompileReferences(); 
     } 
     catch 
     { 
      // ignored 
     } 
     return view.RowCount; ************************** MAGIC GOES HERE 
    } 

    throw new InvalidDataException(string.Format( "The SQL table/view {0} does not exist in database {1}, or is not accessible by the current user.", 
SqlTableName, SqlDatabaseName)); 
} 

ответ

1

Я думаю, что ответ «нет», если вид не является индексированное (или материализованное) представление. Я говорю, что, поскольку SMO, похоже, смотрит на метаданные в sys.partitions, чтобы определить количество строк, и никакая строка не будет существовать там, если данные, лежащие в основе представления, не будут сохранены на диске. Это происходит только при индексировании представления.

+0

, что имеет большой смысл, поэтому я вынужден сделать запрос, чтобы увидеть, есть ли записи, потому что информация Я хочу, не хранится в метаданных .. – user230910

1

Если вы не можете найти другой путь, вы всегда можете использовать метод ExecuteWithResults, чтобы выбрать одну строку и одно поле. Затем вы можете проверить результаты, чтобы узнать, вернули ли они какие-либо строки.

var server = new Server(); 
var db = server.Databases("northwind"); 
var results = db.ExecuteWithResults("select top 1 ID from [ViewName]"); 
+0

Это немного ближе, с помощью smo-соединения, чтобы получить значение. Я понятия не имею, какие поля у таблицы есть, поэтому идентификатор может не существовать. – user230910

+0

ID - всего лишь образец поля. Замените его на [ViewName]. [ViewField] на основе того, где вы его вызываете. –

+0

Другая мысль заключается в том, что если вам не нужны данные о количестве полученных данных, вы также можете сделать выбор * из [ViewName], чтобы увидеть, есть ли у него строки. –

1

Просто используйте соединение ADO.NET выполнить команду:

 var cmd = sqlConnection.CreateCommand(); 

     cmd.CommandText = string.Format(@"if exists(select * from {0}) 
          select 1 as exist 
          else 
          select 0 as exist", SqlTableName); 

     var result = (int)cmd.ExecuteScalar(); 

если результат == 1, то некоторые записи существует

+0

Мне это нравится, но я надеялся сделать это без фактического запроса, используя метаданные SMO, живущие с – user230910