如何查询SQL Server中包含指定列的非空表?
解决方案:SQL Server 筛选含指定列且非空的表
很容易把这两个需求结合起来,核心思路就是先筛选出包含目标列的表集合,再从中挑出有数据的表,或者反过来通过关联查询同时满足两个条件。我给你两种实用的写法,你可以根据需求选:
方法一:子查询过滤(简洁高效)
先通过INFORMATION_SCHEMA.COLUMNS拿到所有含%company%列的表名,再在非空表统计中筛选这些表:
SELECT OBJECT_NAME(p.[object_id]) AS table_name, SUM(p.row_count) AS row_count, p.[object_id] FROM sys.dm_db_partition_stats p INNER JOIN sys.tables t ON p.[object_id] = t.[object_id] WHERE p.index_id IN (0, 1) -- 只统计堆表(0)和聚集索引(1)的总行数,避免重复统计 AND OBJECT_NAME(p.[object_id]) IN ( SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%company%' ) GROUP BY p.[object_id] HAVING SUM(p.row_count) > 0 -- 只保留有数据的表
方法二:JOIN关联(可查看列信息)
如果需要同时看到匹配的列名,可以用JOIN把两个结果集关联起来,这样能直观看到每个表中哪些列符合%company%的条件:
SELECT DISTINCT c.TABLE_SCHEMA + '.' + c.TABLE_NAME AS full_table_name, -- 带上schema避免同名表混淆 c.COLUMN_NAME, s.row_count FROM INFORMATION_SCHEMA.COLUMNS c INNER JOIN ( -- 子查询获取所有非空表的行数统计 SELECT SCHEMA_NAME(t.schema_id) + '.' + OBJECT_NAME(p.[object_id]) AS full_table_name, SUM(p.row_count) AS row_count FROM sys.dm_db_partition_stats p INNER JOIN sys.tables t ON p.[object_id] = t.[object_id] WHERE p.index_id IN (0, 1) GROUP BY SCHEMA_NAME(t.schema_id), p.[object_id] HAVING SUM(p.row_count) > 0 ) s ON c.TABLE_SCHEMA + '.' + c.TABLE_NAME = s.full_table_name WHERE c.COLUMN_NAME LIKE '%company%' ORDER BY full_table_name
注意事项
sys.dm_db_partition_stats返回的行数是近似值,但对于绝大多数业务场景足够准确;如果需要精确行数,可以把子查询换成EXEC sp_MSforeachtable 'SELECT ''?'' AS table_name, COUNT(*) AS row_count FROM ? HAVING COUNT(*) > 0',但这个方法在大数据库中效率极低,谨慎使用。- 加上
TABLE_SCHEMA是为了处理同一个数据库下不同schema的同名表,比如dbo.User和test.User,避免混淆。 DISTINCT是为了避免同一个表因为有多个匹配列而重复输出。
内容的提问来源于stack exchange,提问作者VBIL
相关产品推荐
相关产品推荐

