Sp_msforeachtable在C#中返回第一个表

时间:2012-05-20 18:21:33

标签: c# sql-server sp-msforeachdb

我想用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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

考虑从sys.tables而不是sp_msforeachtable查询:

select name from [DbName].sys.tables

这将返回单个行集中的所有表。