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
相关产品推荐
相关产品推荐

