2012-05-20 2 views
1

테이블을 나열하고 싶습니다. sp_msforeachtable.i가있는 데이터베이스에서 SSMS로 작성했는데 (sp_list2 저장 프로 시저에서 작성했습니다), C#에서이 저장 프로 시저를 사용하려면 그냥 목록 상자에 데이터베이스의 첫 번째 테이블을 반환합니다!Sp_msforeachtable은 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 
      } 

내 저장 프로 시저 :

당신은 당신의 for 루프 내에서 rdr.NextResult();을 둘 필요가
create procedure sp_list2(@dbname nvarchar(max)) 
as 
declare @query as nvarchar(max) 
--declare @dbname as nvarchar(max) 
SET @query='' 
SET @query [email protected] + @dbname + '..sp_msforeachtable '' select ''''?'''' as ''''Table'''',   count(*) as ''''Rows'''' from ? ''' 
EXEC sp_executesql @query 
+0

저장 프로 시저의 모양은 어떻습니까? – adrianbanks

+0

내 질문을 편집했습니다. – Arash

답변

2

:

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

sp_MsForEachTable 반환을 여러 결과 집합을 (각 테이블마다 하나씩), 다음 res로 이동해야합니다. 현재 행에서 읽을 열이 더 이상 없을 때 NextResult을 사용하여 설정됩니다.

select t.name, p.rows from sys.tables t, sys.partitions p 
where t.object_id = p.object_id 
1

sys.tables에서 쿼리 고려 : 각 테이블의 행 수를 얻으려고 노력하는 것처럼 보이는

그러나, 당신은 선택적으로 하나의 결과 집합을 반환하는 쿼리에서이 작업을 수행 할 수 대신 sp_msforeachtable의 :

select name from [DbName].sys.tables 

이는 단일 행 집합의 모든 테이블을 반환합니다.