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
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
affichage du catalogue sys.partitions
sys.dm_db_partition_stats Vue de gestion dynamique (DMV)
procédure stockée du système sp_MSforeachtable
Fonction COALESCE ()
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;