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

请求编写SQL查询:获取所有数据库表名、列名及各列总行数

跨所有数据库查询表名、列名及列非空行数

你的现有查询只能返回表级的总行数,无法关联到具体列,也没有覆盖所有数据库。结合你的示例结果(同一表不同列行数不同,实际是统计列的非空行数),可以用动态SQL实现需求:

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

SELECT @SQL += N'
USE ' + QUOTENAME(db.name) + N';
SELECT 
    ''' + QUOTENAME(db.name) + N'.'' + QUOTENAME(s.name) + ''.'' + QUOTENAME(t.name) AS TableName,
    c.name AS ColumnName,
    COUNT(c.name) AS TotalRowCount
FROM 
    sys.tables t
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sys.columns c ON t.object_id = c.object_id
CROSS APPLY (SELECT 1 FROM ' + QUOTENAME(db.name) + N'.' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name) + N') AS tbl_rows
GROUP BY s.name, t.name, c.name
'
FROM sys.databases db
WHERE db.database_id > 4 -- 排除master、model、msdb、tempdb等系统库
AND db.state_desc = N'ONLINE'; -- 仅处理在线数据库

EXEC sp_executesql @SQL;

关键说明:

  1. 非空行数 vs 表总行数:示例中同一表不同列的行数不同,这里用COUNT(c.name)统计列的非空行数。如果需要表的总行数(同一表所有列的数值相同),替换为COUNT(*)即可。
  2. 跨数据库遍历:通过sys.databases获取所有用户数据库,动态生成每个库的查询语句并执行。
  3. 特殊字符兼容:用QUOTENAME包裹对象名,避免因名称含特殊字符导致语法错误。

如果只需要查询当前数据库的信息,用下面的简化语句:

SELECT 
    QUOTENAME(s.name) + '.' + QUOTENAME(t.name) AS TableName,
    c.name AS ColumnName,
    COUNT(c.name) AS TotalRowCount
FROM 
    sys.tables t
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sys.columns c ON t.object_id = c.object_id
CROSS APPLY (SELECT 1 FROM t) AS tbl_rows
GROUP BY s.name, t.name, c.name
ORDER BY TableName, ColumnName;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:15:50