SqlServer如何查询所有非空数据表?
如何检索SQL Server中所有非空的数据表
当然可以!要找出SQL Server里所有包含数据的非空表,这里有几个实用的方法,你可以根据自己的场景选择:
方法一:利用系统视图(高效推荐)
通过sys.tables和sys.partitions这两个系统视图能快速获取近似的非空表列表,这个方法性能出色,不需要扫描每张表的全部数据:
SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, t.name AS TableName, SUM(p.rows) AS RowCount FROM sys.tables t JOIN sys.partitions p ON t.object_id = p.object_id WHERE t.is_ms_shipped = 0 -- 排除系统自带的表 AND p.index_id IN (0, 1) -- 只统计堆表或聚集索引的行数 GROUP BY SCHEMA_NAME(t.schema_id), t.name HAVING SUM(p.rows) > 0 ORDER BY SchemaName, TableName;
说明:
sys.partitions里的rows字段是SQL Server维护的近似行数,更新可能有小延迟,但对绝大多数场景来说完全够用- 加上
t.is_ms_shipped = 0可以过滤掉系统表,只显示你自己创建的用户表
方法二:精确统计(适合小数据量场景)
如果需要绝对精确的行数,可以用动态SQL遍历所有表并执行COUNT(*),不过这个方法在表多或数据量大的时候会很慢:
DECLARE @SQL NVARCHAR(MAX) = ''; SELECT @SQL = @SQL + 'SELECT ''' + SCHEMA_NAME(t.schema_id) + ''' AS SchemaName, ''' + t.name + ''' AS TableName, COUNT(*) AS RowCount FROM ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + ' UNION ALL ' FROM sys.tables t WHERE t.is_ms_shipped = 0; SET @SQL = LEFT(@SQL, LEN(@SQL) - 10); -- 去掉最后多余的UNION ALL EXEC sp_executesql @SQL;
优化版(仅判断是否非空):
如果只是要确认表有没有数据,不需要精确行数,可以把COUNT(*)改成EXISTS,性能会提升不少:
DECLARE @SQL NVARCHAR(MAX) = ''; SELECT @SQL = @SQL + 'SELECT ''' + SCHEMA_NAME(t.schema_id) + ''' AS SchemaName, ''' + t.name + ''' AS TableName, CASE WHEN EXISTS(SELECT 1 FROM ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + ') THEN ''非空'' ELSE ''空表'' END AS TableStatus UNION ALL ' FROM sys.tables t WHERE t.is_ms_shipped = 0; SET @SQL = LEFT(@SQL, LEN(@SQL) - 10); EXEC sp_executesql @SQL;
小提示
- 日常排查用方法一就足够了,速度快还能看到大致行数
- 精确统计只在你需要绝对准确的行数时使用,不然没必要浪费性能
内容的提问来源于stack exchange,提问作者DarioN1
相关产品推荐
相关产品推荐

