2011-03-03 7 views
6

은 내가SQL Server 2000 : 테이블 목록과 행 수는 어떻게 계산합니까?

SELECT TABLE_NAME FROM information_schema.tables 
WHERE NOT TABLE_NAME='sysdiagrams' 
    AND TABLE_SCHEMA = 'dbo' 
    AND TABLE_TYPE= 'BASE TABLE' 

와 테이블의 목록을 얻을 수 있다는 사실을 알고하지만 테이블에 대한 행의 현재 카운트와 함께 제 2의 열을 얻을 것을 수정하는 방법을 모르겠어요. 나는 이런 일의 비록 :

DECLARE @tbl VARCHAR(200) 
(SELECT @tbl = TABLE_NAME, TABLE_NAME, 
(SELECT COUNT(ID) AS Cnt FROM @tbl) 
FROM information_schema.tables 
WHERE NOT TABLE_NAME='sysdiagrams' 
    AND TABLE_SCHEMA = 'dbo' 
    AND TABLE_TYPE= 'BASE TABLE') 

나는 위의 유효한 T-SQL 아니라는 것을 알고 있지만, 나는 내가 같은 완료 한 것입니다 무슨의 포인트를 얻을 생각합니다. 이것은 SQL Server 2000을위한 것입니다. 가능한 경우 저장소 프로 시저를 사용하지 않는 것이 좋습니다.

답변

12

신속하고 더러운 방법은 당신이 일에 전체 돼지 갈 수

select o.name, rows 
from sysindexes i join sysobjects o on o.id=i.id 
where indid < 2 and type='U' 
0
exec sp_MSforeachtable 'select count(*) as nr_of_rows, ''?'' as table_name from ?'
+0

이렇게하면 모든 정보가 포함 된 단일 쿼리가 아닌 각 테이블에 대해 별도의 쿼리가 생성됩니다. – Justin808

+0

@ Justin808 : 예, 정확한 행 수를 반환합니다 –

+0

사실, 내 상황에서는 대략 1 개의 테이블 작업이 모두 수용 가능하고 더 적은 작업이 필요합니다. 정확한 카운트를 얻는 방법을 아는 것이 좋습니다. – Justin808

0

(힙에 커밋되지 않은 변경 가능성이 전달 포인터를 포함). sysIndexes를 사용하여 rowcount를 얻는 문제는 항상 최신이 아닌 것입니다. 그래도 모두 최신으로 유지할 수있는 방법이 있습니다. 다음 코드는 각 테이블에 대한 행 수와 전체 묶음을 제공합니다. 방법 "dtproperties에"와 "sysdiagrams"에 대한

/********************************************************************************************************************** 
Purpose: 
Returns a single result set similar to sp_Space used for all user tables at once. 

Notes: 
1. May be used as a view, stored procedure, or table-valued function. 
2. Must comment out 1 "Schema" in the SELECT list below prior to use. See the adjacent comments for more info. 

Revision History: 
Rev 00 - 22 Jan 2007 - Jeff Moden 
         - Initital creation for SQL Server 2000 
Rev 01 - 11 Mar 2007 - Jeff Moden 
         - Add automatic page size determination for future compliance 
Rev 02 - 05 Jan 2008 - Jeff Moden 
         - Change "Owner" to "Schema" in output. Add optional code per Note 2 to find correct schema name 
**********************************************************************************************************************/ 
--===== Ensure that all row counts, etc is up to snuff 
    -- Obviously, this will not work in a view or UDF and should be removed if in a view or UDF. External code should 
    -- execute the command below prior to retrieving from the view or UDF. 
    DBCC UPDATEUSAGE(0) WITH COUNT_ROWS, NO_INFOMSGS 

--===== Return the single result set similar to what sp_SpaceUsed returns for a table, but more 
SELECT DBName  = DB_NAME(), 
     --SchemaName = SCHEMA_NAME(so.UID), --Comment out if for SQL Server 2000 
     SchemaName = USER_NAME(so.UID), --Comment out if for SQL Server 2005 
     TableName = so.Name, 
     TableID  = so.ID, 
     MinRowSize = MIN(si.MinLen), 
     MaxRowSize = MAX(si.XMaxLen), 
     ReservedKB = SUM(CASE WHEN si.IndID IN (0,1,255) THEN si.Reserved  ELSE 0 END) * pkb.PageKB, 
     DataKB  = SUM(CASE WHEN si.IndID IN (0,1 ) THEN si.DPages   ELSE 0 END) * pkb.PageKB 
        + SUM(CASE WHEN si.IndID IN ( 255) THEN ISNULL(si.Used,0) ELSE 0 END) * pkb.PageKB, 
     IndexKB  = SUM(CASE WHEN si.IndID IN (0,1,255) THEN si.Used   ELSE 0 END) * pkb.PageKB 
        - SUM(CASE WHEN si.IndID IN (0,1 ) THEN si.DPages   ELSE 0 END) * pkb.PageKB 
        - SUM(CASE WHEN si.IndID IN ( 255) THEN ISNULL(si.Used,0) ELSE 0 END) * pkb.PageKB, 
     UnusedKB  = SUM(CASE WHEN si.IndID IN (0,1,255) THEN si.Reserved  ELSE 0 END) * pkb.PageKB 
        - SUM(CASE WHEN si.IndID IN (0,1,255) THEN si.Used   ELSE 0 END) * pkb.PageKB, 
     Rows   = SUM(CASE WHEN si.IndID IN (0,1 ) THEN si.Rows   ELSE 0 END), 
     RowModCtr = MIN(si.RowModCtr), 
     HasTextImage = MAX(CASE WHEN si.IndID IN ( 255) THEN 1     ELSE 0 END), 
     HasClustered = MAX(CASE WHEN si.IndID IN ( 1 ) THEN 1     ELSE 0 END) 
    FROM dbo.SysObjects so, 
     dbo.SysIndexes si, 
     (--Derived table finds page size in KB according to system type 
     SELECT Low/1024 AS PageKB --1024 is a binary Kilo-byte 
      FROM Master.dbo.spt_Values 
      WHERE Number = 1 --Identifies the primary row for the given type 
      AND Type = 'E' --Identifies row for system type 
     ) pkb 
    WHERE si.ID = so.ID 
    AND si.IndID IN (0, --Table w/o Text or Image Data 
        1, --Table with clustered index 
        255) --Table w/ Text or Image Data 
    AND so.XType = 'U' --User Tables 
    AND PERMISSIONS(so.ID) <> 0 
    GROUP BY so.Name, 
      so.UID, 
      so.ID, 
      pkb.PageKB 
    ORDER BY ReservedKB DESC 
-1

? 이 테이블은 사용자 테이블로 잘못 표시됩니다.

관련 문제