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

MSSQL中如何调用嵌套查询返回的表名统计各表数据行数

你原本的写法不可行,因为MSSQL静态SQL不支持直接将查询返回的字段值作为表名使用,需要通过动态SQL拼接的方式实现需求,两种可行方案如下:


方案1:动态SQL统计(行数100%准确)

DECLARE @sql NVARCHAR(MAX) = N'';

-- 拼接所有表的行数统计语句,用UNION ALL合并结果
SELECT @sql += N'UNION ALL
SELECT N''' + REPLACE(TABLE_NAME, '''', '''''') + N''' AS TABLE_NAME, COUNT(*) AS NUMBERS
FROM [db_name].[schema_name].' + QUOTENAME(TABLE_NAME) + N'
'
FROM [db_name].[schema_name].[tables_list];

-- 移除开头多余的UNION ALL关键字
SET @sql = STUFF(@sql, 1, 10, N'');

-- 执行拼接完成的SQL
EXEC sp_executesql @sql;

注意事项:

  • 请将代码中的[db_name]、[schema_name]替换为你实际使用的数据库名和架构名(默认架构通常为dbo)
  • 代码中使用QUOTENAME和单引号转义处理,避免表名含特殊字符、保留字时报错,同时规避SQL注入风险
  • 如果tables_list中存储的表归属于不同架构/数据库,你需要在表中新增对应存储架构、数据库名的字段,拼接时对应替换即可

方案2:系统视图查询(性能极高,允许微小误差)

如果不需要绝对实时的精确行数,可直接查询系统统计视图获取行数,不需要遍历全表,性能远高于方案1,适合大表场景:

SELECT
    tl.TABLE_NAME,
    p.rows AS NUMBERS
FROM [db_name].[schema_name].[tables_list] tl
JOIN sys.tables t ON t.name = tl.TABLE_NAME
JOIN sys.partitions p ON t.object_id = p.object_id
WHERE p.index_id IN (0,1) -- 仅统计堆表/聚集索引,避免非聚集索引带来的重复计数

注意:该方案依赖数据库的统计信息更新,如果刚完成大批量增删操作,可先执行UPDATE STATISTICS更新统计信息后再查询,保证行数准确性。


内容的提问来源于stack exchange,提问作者MJBZA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:06:05