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
你需要把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
这将返回单个行集中的所有表。