查找包含列名称的所有表;过滤空虚

时间:2017-01-18 19:06:48

标签: sql sql-server

我一直在使用这里找到的SQL: Find all tables containing column with specified name

取得巨大成功。它允许我查找包含特定列的所有表。我的问题是,我正在处理的数据库似乎有很多空表(可能大约一半的结果都是空的)。我想知道是否有办法修改链接中的代码,以便不显示空行/列。下面是链接中的代码:

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;

谢谢,

1 个答案:

答案 0 :(得分:6)

这样的事情可能会毫不费力地发挥作用:

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
            ,p.rows
FROM sys.columns c
INNER JOIN sys.tables t
ON c.object_id = t.object_id
INNER JOIN sys.partitions p
on t.object_id = p.object_id
WHERE       c.name LIKE '%p%'
            AND p.rows > 0
ORDER BY    TableName
            ,ColumnName;

请注意,sys.partitions无法保证行数准确无误; sys.dm_db_index_physical_stats可能会更好(参见https://dba.stackexchange.com/questions/55124/how-accurate-is-the-sys-partition-rows-column)。这可能会给你一个更好的计数,但如果你使用AlwaysOn可能会有更多的锁定问题:

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
            ,ips.record_count
FROM sys.columns c
INNER JOIN sys.tables t
ON c.object_id = t.object_id
CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), t.object_id, null, null, 'DETAILED') ips
WHERE       c.name LIKE '%p%'           
            AND ips.record_count > 0
ORDER BY    TableName
            ,ColumnName;

如果您确实需要100%的可靠性,那么您实际上要在每个表(使用动态SQL)上执行COUNT(*),但这可能已经足够了。