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:
- requête pour lister le nombre d'enregistrements dans chaque table dans une base de données 17 réponses
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?
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.
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
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 .
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
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 /
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:
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
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.
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
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
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
).
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%')
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