2012-03-31 14 views
16

Może łatwo powiedziałeś, jak podać nazwy tabel i liczby wierszy?Skrypt, który podaje liczby wierszy i nazwy tabel.

Pseudo SQL:

for "select tablename from system.Tables" into :tablename 
    execute "select count(*) from ? into ?" using :tablename, :count 
    return row(:tablename, :count) 
end for 

możesz mi pokazać mi ten skrypt w T-SQL?

Odpowiedz

48

Jeśli jesteś na SQL Server 2005 lub nowszy (ty niestety nie określić, które wersję SQL Server używasz), to zapytanie może dać Ci te informacje:

SELECT 
    TableName = t.NAME, 
    TableSchema = s.Name, 
    RowCounts = p.rows 
FROM 
    sys.tables t 
INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
WHERE 
    t.is_ms_shipped = 0 
GROUP BY 
    t.NAME, s.Name, p.Rows 
ORDER BY 
    s.Name, t.Name 

daje to coś podobnego wyjściowego (to jest z AdventureWorks):

TableName  TableSchema  RowCounts 
AWBuildVersion dbo     1 
DatabaseLog  dbo    1597 
ErrorLog   dbo     0 
Department  HumanResources  16 
Employee   HumanResources  290 
JobCandidate  HumanResources  13 
Address   Person   19614 
AddressType  Person    6 
... and so on...... 
+0

Arent't tych rowcounts jedynie wartościami? –

+0

@a_horse_with_no_name: nie ** szacunki ** - ale przybliżenia. Liczba wierszy jest aktualizowana regularnie - ale w danym momencie nie są one w 100% dokładne, jeśli wykonano wiele wstawień lub usunięć, to prawda. Ale wykonanie "SELECT COUNT (*)" na wszystkich tabelach w przyzwoitej wielkości bazie danych ze znaczną liczbą wierszy będzie po prostu ** okropne ** pod względem wydajności i czasu wykonania ... –

2
-- Shows all user tables and row counts for the current database 
-- Remove OBJECTPROPERTY function call to include system objects 
SELECT o.NAME, 
    i.rowcnt 
FROM sysindexes AS i 
    INNER JOIN sysobjects AS o ON i.id = o.id 
WHERE i.indid < 2 AND OBJECTPROPERTY(o.id, 'IsMSShipped') = 0 
ORDER BY o.NAME 
+0

Spróbuję wszystkich rozwiązań ! Dzięki! – durumdara

1
exec sp_MSForEachTable 'SELECT ''?'' as TableName, COUNT(*) as Rows FROM ?' 
0

Spróbuj tego

-- drop table #tmpspace 
create table #tmpspace (
     name sysname 
     , rows int 
     , reserved varchar(50) 
     , data varchar(50) 
     , index_size varchar(50) 
     , unused varchar(50) 
     ) 

dbcc updateusage(0) with NO_INFOMSGS 

exec sp_msforeachtable 'insert #tmpspace exec sp_spaceused ''?''' 

select * from #tmpspace 
order by convert(int, substring(reserved, 1, charindex(' ', reserved))) desc, rows desc, name 

Works na SQL2000 też.

może zająć trochę czasu, ale wyniki będą w 100% rzeczywiste. Pomiń to, jeśli potrzebujesz szybkości nad dokładnością.

1

Poprawiłem odpowiedź z marc_c przy użyciu CTE i wyświetlając ją z opcją wyświetlania tylko schematu, którego szukasz.

Powinny pracować z SQL Serve 2005 i nowszym.

WITH CountRowsInTables (Table_Name, Table_Schema, Row_Counts) AS 
(
SELECT 
TableName = t.Name, 
TableSchema = s.Name, 
RowCounts = p.Rows 
    FROM 
     sys.tables t 
    INNER JOIN 
     sys.schemas s ON t.schema_id = s.schema_id 
    INNER JOIN  
     sys.indexes i ON t.OBJECT_ID = i.object_id 
    INNER JOIN 
     sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
    WHERE 
     t.is_ms_shipped = 0 
    GROUP BY 
     s.Name, t.Name, p.Rows 
) 

SELECT Table_name, Table_Schema, Row_Counts 
    FROM CountRowsInTables 
    WHERE Table_Schema = 'Pick_Schema_to_display'; 
1
SELECT 
t.NAME AS TableName, p.[Rows] FROM 
sys.tables t INNER JOIN 
sys.partitions p ON t.object_id = p.OBJECT_ID GROUP BY 
t.NAME, p.[Rows] ORDER BY t.NAME 
Powiązane problemy