Sp_msforeachtable只返回 C# 中的第一个表

本文关键字:第一个 返回 msforeachtable Sp | 更新日期: 2023-09-27 18:34:40

我想列出带有 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

Sp_msforeachtable只返回 C# 中的第一个表

你需要把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

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