请求编写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;
关键说明:
- 非空行数 vs 表总行数:示例中同一表不同列的行数不同,这里用
COUNT(c.name)统计列的非空行数。如果需要表的总行数(同一表所有列的数值相同),替换为COUNT(*)即可。 - 跨数据库遍历:通过
sys.databases获取所有用户数据库,动态生成每个库的查询语句并执行。 - 特殊字符兼容:用
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
相关产品推荐
相关产品推荐

