1

我想用 sp_msforeachtable 列出数据库的表。我在 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
4

2 回答 2

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
于 2012-05-20T18:45:02.513 回答
1

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

select name from [DbName].sys.tables

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

于 2012-05-20T18:49:15.537 回答