1

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
4

2 に答える 2

2

ループrdr.NextResult();内に配置する必要があります。for

while (rdr.Read())
{
    listBox1.Items.Add(rdr[0]);//this is tables name
    rdr.NextResult();
}

sp_MsForEachTable複数の結果セット (テーブルごとに 1 つ) を返すため、NextResult現在の結果セットから読み取る行がそれ以上ない場合は、を使用して次の結果セットに移動する必要があります。

ただし、各テーブルの行数を取得しようとしているように見えるため、代わりに、1 つの結果セットのみを返すクエリでこれを行うこともできます。

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 に答える