C# 将sp_MSForEachTable与SqlDataReader一起使用
我试图编写一个函数来获取数据库中表的大小。我知道sp_MSForEachTable的注意事项,但我认为这是一个合适的用法。这是我目前的代码:C# 将sp_MSForEachTable与SqlDataReader一起使用,c#,sql-server,C#,Sql Server,我试图编写一个函数来获取数据库中表的大小。我知道sp_MSForEachTable的注意事项,但我认为这是一个合适的用法。这是我目前的代码: SqlCommand dbTableSizes = new SqlCommand("sp_MSForEachTable", Conn); dbTableSizes.Parameters.AddWithValue("@command1", "'exec sp_spaceused \"?\"'");
SqlCommand dbTableSizes = new SqlCommand("sp_MSForEachTable", Conn);
dbTableSizes.Parameters.AddWithValue("@command1", "'exec sp_spaceused \"?\"'");
dbTableSizes.CommandType = CommandType.StoredProcedure;
SqlDataReader dbTableSizeReader = dbTableSizes.ExecuteReader();
但是,每个表都有一个“不正确的语法”异常。括号和引号位于正确的位置,
exec sp_MSForEachTable“exec sp_spaceused”?“
在SSMS中运行时有效(如预期)。那么到底发生了什么?感谢您的帮助。这在拨打sp\u MSforeachtable时起到了作用:
SqlCommand command = new SqlCommand("sp_MSforeachtable @command1='EXEC sp_spaceused ''?'''", con);
con.Open();
using (SqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
Console.Writeline("Name: " + dr.GetString(0));
Console.Writeline("Rows: " + dr.GetString(1));
Console.Writeline("Reserved: " + dr.GetString(2));
Console.Writeline("Data: " + dr.GetString(3));
Console.Writeline("IndexSize: " + dr.GetString(4));
Console.Writeline("Unused: " + dr.GetString(5));
dr.NextResult();
}
}
参数本身的值为
exec sp_spaceused”?“
;单引号仅在作为语句的一部分传递时分隔文字。(请注意,由于spmsforeachtable
返回多个结果集,因此需要.NextResult
以及.Read
,这是不寻常的。)谢谢。我错过了。既然这只是幕后的一个光标,为什么不自己滚动一下呢?代码中使用的未记录的过程总是一触即发的。我按顺序为一堆数据库运行这个过程(这可能会在以后的更多数据库中重复),我不想为每个数据库设置新的SP。我也不想在我的应用程序之间有太多的来回,担心它看起来会很混乱。也许我对这些事情没有理性。:)但是谢谢你的评论。如果有一个链接,你可以提供参考,我会很高兴地学习。