You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:如何查询SQL数据库各表的MAX(updated_timestamp)与行数

问题描述

我们的SQL数据库内有200余张表,每张表均包含公共字段[updated_timestamp]。想通过查询数据库本身,列出所有表的名称、[updated_timestamp]的最大值以及各表的行数,期望输出格式如下:

表名updated_timestamprow_count
表A2022-08-2289,854
表B2022-08-1810,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:48:25