2012-03-31 12 views

Respuesta

48

Si estás en SQL Server 2005 o posterior (que por desgracia no especificó qué versión de SQL Server que está utilizando), esta consulta debe darle esa información:

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 

esto produce una salida como algo (esto es de 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

NO ESTÁN esos rowcounts sólo estimaciones? –

+0

@a_horse_with_no_name: no ** estimaciones ** - pero aproximaciones. Los recuentos de filas se actualizan regularmente, pero no son 100% precisos en un momento dado si realizó muchas inserciones o eliminaciones, eso es correcto. Pero hacer un 'SELECT COUNT (*)' en todas las tablas en una base de datos decente con un número considerable de filas será simplemente ** horrible ** en términos de rendimiento y tiempo de ejecución .... –

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

Voy a probar todas las soluciones ! ¡Gracias! – durumdara

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

probar este

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

Obras en SQL2000 también.

dbcc updateusage puede llevar algo de tiempo, pero los resultados serán 100% reales. Omita esto si necesita velocidad sobre la precisión.

1

He ajustado la respuesta de marc_c con CTE y la muestra con la opción de mostrar solo el esquema que está buscando.

Debería funcionar con SQL Serve 2005 y posteriores.

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 
Cuestiones relacionadas