咨询:如何查询SQL数据库各表的MAX(updated_timestamp)与行数
问题描述
我们的SQL数据库内有200余张表,每张表均包含公共字段[updated_timestamp]。想通过查询数据库本身,列出所有表的名称、[updated_timestamp]的最大值以及各表的行数,期望输出格式如下:
| 表名 | updated_timestamp | row_count |
|---|---|---|
| 表A | 2022-08-22 | 89,854 |
| 表B | 2022-08-18 | 10,355,166 |
解决方案
系统表相关说明
SQL Server里没有直接存储updated_timestamp最大值的系统表,这个字段的最大值必须直接查询对应业务表才能获取;行数统计可以通过sys.partitions视图拿到近似值,但如果需要精确行数,直接统计表数据会更可靠。
优化后的实现代码
你提供的代码思路可行,但可以优化效率,用动态SQL一次性完成所有查询,避免游标循环更新的开销:
DECLARE @sql NVARCHAR(MAX) = N'' SELECT @sql += N' SELECT ''' + QUOTENAME(sOBJ.name) + ''' AS 表名, MAX([updated_timestamp]) AS updated_timestamp, COUNT(*) AS row_count FROM ' + QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + '.' + QUOTENAME(sOBJ.name) + ' UNION ALL' FROM sys.objects AS sOBJ WHERE sOBJ.type = 'U' -- 仅筛选用户创建的表 AND sOBJ.is_ms_shipped = 0x0 -- 排除系统内置表 AND EXISTS ( SELECT 1 FROM sys.columns c WHERE c.object_id = sOBJ.object_id AND c.name = 'updated_timestamp' ) -- 确保表包含目标字段 AND SCHEMA_NAME(sOBJ.schema_id) = 'api' -- 仅保留api架构下的表 -- 移除最后多余的UNION ALL SET @sql = LEFT(@sql, LEN(@sql) - 10) EXEC sp_executesql @sql
关于你提供的原代码
原代码通过临时表存储行数,再用游标逐个查询updated_timestamp最大值,逻辑通顺,但游标循环更新的效率较低,面对200多张表时,上面的动态SQL方案会更高效。另外需要注意:
sys.partitions中的行数是近似值,若表有频繁的增删操作,可能和实际行数有偏差;如果需要精确行数,建议用COUNT(*)统计。- 原代码中仅保留了
[api]架构下的表,优化后的代码也延续了这个过滤规则。
内容的提问来源于stack exchange,提问作者teelove
相关产品推荐
相关产品推荐

