Sp_msforeachtable возвращает только первую таблицу в C#

Я хочу перечислить таблицы базы данных с sp_msforeachtable.i хорошо это сделал в SSMS(я написал это в хранимой процедуре sp_list2), но когда я хочу использовать эту хранимую процедуру в 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 =@query + @dbname + '..sp_msforeachtable '' select ''''?'''' as ''''Table'''',           count(*) as ''''Rows'''' from ? ''' 
EXEC sp_executesql @query

2 ответа

Решение

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

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

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

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

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

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

select name from [DbName].sys.tables

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

Другие вопросы по тегам