2011-03-03 13 views
6

BenSQL Server 2000: tabloların listesini ve satır sayılarını nasıl alabilirim?

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

ile tabloların bir listesini alabilirsiniz biliyorum Ama tablolar için satırların geçerli sayısı ile bir 2 sütun almak için o nasıl değiştirileceğini emin değilim. Böyle bir şey olsa:

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') 

Yukarıda geçerli T-SQL olmadığını biliyoruz ama ben gibi yapardı noktasını alır düşünüyorum. Bu SQL Server 2000 içindir. Mümkünse mağaza prosedürlerini kullanmamayı tercih ederim.

cevap

12

hızlı ve kirli yolu Bu sefer bütün domuz gidebilir

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

Bu, her bir bilgi için tek bir sorguda değil, her tablo için ayrı bir sorgu üretir. – Justin808

+0

@ Justin808: evet, ama doğru satır sayımları –

+0

Doğru döndürecektir, benim durumumda yaklaşık 1 tablo çalışmalarında kabul edilebilir ve daha az iş (benim için) sayılır. Doğru sayıları nasıl alacağımı bilmek güzel. – Justin808

0

(yığınları üzerinde kaydedilmemiş değişiklikleri ve muhtemelen yönlendirme işaretçileri içerir). Rowcounts almak için sysIndexes kullanma sorunu her zaman güncel değildir. Yine de hepsini güncel hale getirmenin bir yolu var. Aşağıdaki kod, her bir tablo için satır sayısı ve daha fazla bir demet verecektir. nasıl "dtproperties" ve "sysdiagrams" hakkında

/********************************************************************************************************************** 
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

? Bu tablo, kullanıcı tablosu hatalı olarak görüntülenecektir

İlgili konular