2012-03-31 60 views
16

也许你会轻松地说我如何提供表名和行数?提供行数和表名的脚本

伪SQL:

for "select tablename from system.Tables" into :tablename 
    execute "select count(*) from ? into ?" using :tablename, :count 
    return row(:tablename, :count) 
end for 

你能告诉我,告诉我在T-SQL这个脚本?

回答

48

如果你的SQL Server上2005或更新(你不幸没有说明具体您正在使用的SQL Server版本),这个查询应该给你的信息:

SELECT 
    TableName = t.NAME, 
    TableSchema = s.Name, 
    RowCounts = p.rows 
FROM 
    sys.tables t 
INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
WHERE 
    t.is_ms_shipped = 0 
GROUP BY 
    t.NAME, s.Name, p.Rows 
ORDER BY 
    s.Name, t.Name 

这产生一个输出类似的信息(这是来自AdventureWorks):

TableName  TableSchema  RowCounts 
AWBuildVersion dbo     1 
DatabaseLog  dbo    1597 
ErrorLog   dbo     0 
Department  HumanResources  16 
Employee   HumanResources  290 
JobCandidate  HumanResources  13 
Address   Person   19614 
AddressType  Person    6 
... and so on...... 
+0

Arent't那些rowcounts只估计? – 2012-03-31 11:27:37

+0

@a_horse_with_no_name:不是**估计** - 而是近似值。行数会定期更新 - 但如果您执行了大量插入或删除操作,则在任何给定时间它们都不是100%准确的,这是正确的。但是,在性能和执行时间方面,在具有相当数量的行的体面大小的数据库中对所有表执行'SELECT COUNT(*)'操作只会是** **。 – 2012-03-31 11:29:04

2
-- 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 
+0

我会尝试所有的解决方案!谢谢! – durumdara 2012-03-31 09:53:53

1
exec sp_MSForEachTable 'SELECT ''?'' as TableName, COUNT(*) as Rows FROM ?' 
0

试试这个

-- drop table #tmpspace 
create table #tmpspace (
     name sysname 
     , rows int 
     , reserved varchar(50) 
     , data varchar(50) 
     , index_size varchar(50) 
     , unused varchar(50) 
     ) 

dbcc updateusage(0) with NO_INFOMSGS 

exec sp_msforeachtable 'insert #tmpspace exec sp_spaceused ''?''' 

select * from #tmpspace 
order by convert(int, substring(reserved, 1, charindex(' ', reserved))) desc, rows desc, name 

作品上SQL2000了。

dbcc updateusage可能需要一些时间,但实际结果将为100%。如果您需要速度超过准确性,请跳过它。

1

我已经调整了marc_c与CTE的答案,并显示它只显示你之后的模式。

应与一起使用SQL Server 2005及更高版本

WITH CountRowsInTables (Table_Name, Table_Schema, Row_Counts) AS 
(
SELECT 
TableName = t.Name, 
TableSchema = s.Name, 
RowCounts = p.Rows 
    FROM 
     sys.tables t 
    INNER JOIN 
     sys.schemas s ON t.schema_id = s.schema_id 
    INNER JOIN  
     sys.indexes i ON t.OBJECT_ID = i.object_id 
    INNER JOIN 
     sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
    WHERE 
     t.is_ms_shipped = 0 
    GROUP BY 
     s.Name, t.Name, p.Rows 
) 

SELECT Table_name, Table_Schema, Row_Counts 
    FROM CountRowsInTables 
    WHERE Table_Schema = 'Pick_Schema_to_display'; 
1
SELECT 
t.NAME AS TableName, p.[Rows] FROM 
sys.tables t INNER JOIN 
sys.partitions p ON t.object_id = p.OBJECT_ID GROUP BY 
t.NAME, p.[Rows] ORDER BY t.NAME 
相关问题