Cómo recuperar el recuento de filas de todas las tablas en una base de datos de SQL SERVER [duplicado]

Resuelto vijaysylvester asked hace 14 años • 13 respuestas

Estoy buscando un script SQL que pueda usarse para determinar si hay datos (es decir, recuento de filas) en alguna de las tablas de una base de datos determinada.

La idea es reencarnar la base de datos en caso de que existan filas (en cualquiera de las bases de datos).

La base de datos de la que se habla es Microsoft SQL Sserver.

¿Alguien podría sugerir un guión de muestra?

vijaysylvester avatar Feb 08 '10 19:02 vijaysylvester
Aceptado

El siguiente SQL le proporcionará el recuento de filas de todas las tablas de una base de datos:

CREATE TABLE #counts
(
    table_name varchar(255),
    row_count int
)

EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?'
SELECT table_name, row_count FROM #counts ORDER BY table_name, row_count DESC
DROP TABLE #counts

El resultado será una lista de tablas y sus recuentos de filas.

Si solo desea el recuento total de filas en toda la base de datos, agregue:

SELECT SUM(row_count) AS total_row_count FROM #counts

obtendrá un valor único para el número total de filas en toda la base de datos.

adrianbanks avatar Feb 08 '2010 13:02 adrianbanks

Si desea evitar el tiempo y los recursos necesarios para contar (*) sus tablas de 3 millones de filas. Pruebe esto según SQL SERVER Central de Kendal Van Dyke.


Recuento de filas usando sysindexes Si está usando SQL 2000, necesitará usar sysindexes de esta manera:

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

Si está utilizando SQL 2005 o 2008, las consultas sysindexes seguirán funcionando, pero Microsoft advierte que los sysindexes pueden eliminarse en una versión futura de SQL Server, por lo que, como buena práctica, debería utilizar los DMV en su lugar, así:

-- Shows all user tables and row counts for the current database 
-- Remove is_ms_shipped = 0 check to include system objects 
-- i.index_id < 2 indicates clustered index (1) or hash table (0) 
SELECT o.name,
  ddps.row_count 
FROM sys.indexes AS i
  INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID
  INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID
  AND i.index_id = ddps.index_id 
WHERE i.index_id < 2  AND o.is_ms_shipped = 0 ORDER BY o.NAME 
Keng avatar May 14 '2010 18:05 Keng