web-dev-qa-db-fra.com

Nombre de lignes de requête pour toutes les tables

J'ai besoin d'aide pour créer une requête MSSQL pour transmettre chaque nom de table à la requête ci-dessous, qui renvoie le nombre de lignes.

Voici comment j'obtiens le nombre de lignes pour une seule table:

SELECT Total_Rows = SUM(st.row_count)
FROM sys.dm_db_partition_stats st
WHERE object_name(object_id) = 'TABLE_NAME' AND (index_id < 2)

Quelle est la façon de boucler cette requête sur toutes les tables, en retournant une sortie du nom et du nombre de lignes de chaque table?

Exemple de sortie:

TableName     RowCount
---------------------
FirstTable    109
SecondTable   2195
ThirdTable    0
5
AndrewRalon

Vous pouvez simplement utiliser ceci:

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

Diverses autres méthodes incluent: ici

  1. affichage du catalogue sys.partitions

  2. sys.dm_db_partition_stats Vue de gestion dynamique (DMV)

  3. procédure stockée du système sp_MSforeachtable

  4. Fonction COALESCE ()

9
KASQLDBA

Déposez la WHERE object_name(object_id) = 'xxx' et à la place GROUP BY le nom de votre objet.

Rejoignez également sys.objects pour obtenir ces objets de type 'U'.

SELECT 
  OBJECT_NAME(st.object_id), 
  Total_Rows = SUM(st.row_count)
FROM sys.dm_db_partition_stats st
INNER JOIN sys.objects AS o 
  ON o.object_id = st.object_id
WHERE (index_id < 2)
  AND o.type = 'U'
GROUP BY st.object_id;
2
Mark Sinkinson