Comment récupérer le nombre de lignes pour toutes les tables D'une base de données SQL SERVER [dupliquer]

cette question a déjà une réponse ici:

je suis à la recherche d'un Script SQL qui peut être utilisé pour déterminer s'il y a des données (i.e. nombre de lignes) dans l'une des tables d'une base de données Donnée.

l'idée est de Ré-incarner la base de données au cas où il y aurait des lignes existantes (dans n'importe quelle base de données).

la base de données dont il est question Est Microsoft SQL SERVER .

quelqu'un Pourrait-il suggérer un exemple de script?

193
demandé sur DineshDB 2010-02-08 15:37:21

13 réponses

le SQL suivant vous obtiendra le nombre de lignes de toutes les tables dans une base de données:

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

le résultat sera une liste de tableaux et leur nombre de lignes.

si vous voulez simplement le nombre total de lignes dans toute la base de données, en ajoutant:

SELECT SUM(row_count) AS total_row_count FROM #counts

vous obtiendra une valeur unique pour le nombre total de lignes dans l'ensemble de la base de données.

312
répondu adrianbanks 2016-07-13 15:26:20

Si vous voulez passer le temps et les ressources qu'il faut pour count(*) votre 3millions rangée de tables. Essayez ceci par serveur SQL Central par Kendal Van Dyke.


nombre de rangs à L'aide de sysindexes Si vous utilisez SQL 2000, vous aurez besoin d'utiliser des sysindexes comme so:

-- 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 vous utilisez SQL 2005 ou 2008, les queserying sysindexes fonctionneront toujours, mais Microsoft vous informe que les sysindexes peuvent être supprimés dans une future version de SQL Comme une bonne pratique, vous devriez utiliser le DMVs à la place, comme ainsi:

-- 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 
161
répondu Keng 2010-05-14 18:55:53

fonctionne sur Azure, ne nécessite pas de procs stockés.

SELECT t.name, s.row_count from sys.tables t
JOIN sys.dm_db_partition_stats s
ON t.object_id = s.object_id
AND t.type_desc = 'USER_TABLE'
AND t.name not like '%dss%'
AND s.index_id IN (0,1)

crédit .

67
répondu Adrian Hope-Bailie 2017-01-27 18:49:52

celui-ci semble mieux que les autres je pense.

USE  [enter your db name here]
GO

SELECT      SCHEMA_NAME(A.schema_id) + '.' +
        A.Name, SUM(B.rows) AS 'RowCount'
FROM        sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE       A.type = 'U'
GROUP BY    A.schema_id, A.Name
GO
33
répondu İsmet Alkan 2013-03-19 10:37:16

SQL Server 2005 or later donne un rapport assez agréable montrant les tailles de table-y compris le nombre de lignes, etc. C'est dans les rapports Standard - et C'est L'Utilisation du disque par Table.

par programmation, il y a une belle solution à: http://www.sqlservercentral.com/articles/T-SQL/67624 /

13
répondu Peter Schofield 2010-02-08 12:40:43

court et doux

sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); 
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) 
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'

sortie:

enter image description here

13
répondu Rikin Patel 2013-10-28 10:36:16
SELECT 
    sc.name +'.'+ ta.name TableName, SUM(pa.rows) RowCnt
FROM 
    sys.tables ta
INNER JOIN sys.partitions pa
    ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
    ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC
12
répondu Rikin Patel 2013-10-28 09:24:27

N'utilisez pas SELECT COUNT(*) FROM TABLENAME , car il s'agit d'une opération à forte intensité de ressources. On devrait utiliser SQL Server Dynamic Management Views ou catalogues système pour obtenir les informations de nombre de lignes pour toutes les tables dans une base de données.

9
répondu Ashish Kumar Mehta 2016-07-13 15:17:16

je voudrais apporter un petit changement à la solution de Frederik. J'utiliserais la procédure stockée du système sp_spaceused qui inclurait également des données et des tailles d'index.


declare c_tables cursor fast_forward for 
select table_name from information_schema.tables 

open c_tables 
declare @tablename varchar(255) 
declare @stmt nvarchar(2000) 
declare @rowcount int 
fetch next from c_tables into @tablename 

while @@fetch_status = 0 
begin 

    select @stmt = 'sp_spaceused ' + @tablename 

    exec sp_executesql @stmt

    fetch next from c_tables into @tablename 

end 

close c_tables 
deallocate c_tables 

3
répondu Vod 2010-02-08 16:05:54

sélectionnez Toutes les lignes à partir du fichier information_schema.afficher les tables, et émettre une instruction count(*) pour chaque entrée qui a été retournée à partir de cette vue.

declare c_tables cursor fast_forward for
select table_name from information_schema.tables

open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename

while @@fetch_status = 0
begin

    select @stmt = 'select @rowcount = count(*) from ' + @tablename

    exec sp_executesql @stmt, N'@rowcount int output', @rowcount=@rowcount OUTPUT

    print N'table: ' + @tablename + ' has ' + convert(nvarchar(1000),@rowcount) + ' rows'

    fetch next from c_tables into @tablename

end

close c_tables
deallocate c_tables
2
répondu Frederik Gheysels 2010-02-08 12:55:04

Voici une approche SQL dynamique qui vous donne aussi le schéma:

DECLARE @sql nvarchar(MAX)

SELECT
    @sql = COALESCE(@sql + ' UNION ALL ', '') +
        'SELECT
            ''' + s.name + ''' AS ''Schema'',
            ''' + t.name + ''' AS ''Table'',
            COUNT(*) AS Count
            FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
    FROM sys.schemas s
    INNER JOIN sys.tables t ON t.schema_id = s.schema_id
    ORDER BY
        s.name,
        t.name

EXEC(@sql)

si nécessaire, il serait trivial de l'étendre à toutes les bases de données de l'instance (joindre sys.databases ).

2
répondu Jon Seigel 2011-07-12 14:03:28

c'est ma solution préférée pour SQL 2008 , qui met les résultats dans un "TEST" table temp que je peux utiliser pour trier et obtenir les résultats dont j'ai besoin:

SET NOCOUNT ON 
DBCC UPDATEUSAGE(0) 
DROP TABLE #t;
CREATE TABLE #t 
( 
[name] NVARCHAR(128),
[rows] CHAR(11),
reserved VARCHAR(18), 
data VARCHAR(18), 
index_size VARCHAR(18),
unused VARCHAR(18)
) ;
INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?''' 
SELECT * INTO TEST FROM #t;
DROP TABLE #t;
SELECT  name, [rows], reserved, data, index_size, unused FROM TEST \
WHERE ([rows] > 0) AND (name LIKE 'XXX%')
1
répondu djangofan 2011-10-31 16:54:56
    SELECT
          SUM(sdmvPTNS.row_count) AS [DBRows]
    FROM
          sys.objects AS sOBJ
          INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS
                ON sOBJ.object_id = sdmvPTNS.object_id
    WHERE 
          sOBJ.type = 'U'
          AND sOBJ.is_ms_shipped = 0
          AND sdmvPTNS.index_id < 2
    GO
1
répondu Howard Rothenburg 2014-04-10 20:43:37