2012-05-20 2 views
1

Я хочу перечислить таблицы из базы данных с sp_msforeachtable.i хорошо это сделал в SSMS (я написал ее в хранимой процедуре sp_list2), но когда я хочу использовать эту хранимую процедуру в C#, она justs возвращают первую таблицу базы данных в поле списка!Sp_msforeachtable Возвращает только первую таблицу в C#

код в C#:

  SqlCommand cmd = cnn.CreateCommand(); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "sp_list2"; 
      SqlParameter inparam = cmd.Parameters.Add("@dbname", SqlDbType.NVarChar); 
      inparam.Direction = ParameterDirection.Input; 
      inparam.Value = "DB"; 
      SqlDataReader rdr = cmd.ExecuteReader(); 
      dap.SelectCommand = cmd; 
      while (rdr.Read()) 
      { 
       listBox1.Items.Add(rdr[0]);//this is tables name 
      } 

Моя хранимая процедура:

create procedure sp_list2(@dbname nvarchar(max)) 
as 
declare @query as nvarchar(max) 
--declare @dbname as nvarchar(max) 
SET @query='' 
SET @query [email protected] + @dbname + '..sp_msforeachtable '' select ''''?'''' as ''''Table'''',   count(*) as ''''Rows'''' from ? ''' 
EXEC sp_executesql @query 
+0

Как выглядит ваша хранимая процедура? – adrianbanks

+0

Я отредактировал мой вопрос – Arash

ответ

2

Вам нужно положить rdr.NextResult(); внутри for цикла:

while (rdr.Read()) 
{ 
    listBox1.Items.Add(rdr[0]);//this is tables name 
    rdr.NextResult(); 
} 

sp_MsForEachTable возвращает несколько наборов результатов (по одному для каждой таблицы), поэтому вам нужно перейти к следующему res ult, используя NextResult, когда нет следующих строк для чтения с текущего.

Однако, как это выглядит, как вы пытаетесь получить количество строк в каждой таблице, в качестве альтернативы может сделать это в запросе, который будет возвращать только один набор результатов:

select t.name, p.rows from sys.tables t, sys.partitions p 
where t.object_id = p.object_id 
1

Рассмотрим запрос от sys.tables вместо sp_msforeachtable:

select name from [DbName].sys.tables 

Это будет возвращать все таблицы в одном наборе строк.

Смежные вопросы