我一直在使用这里找到的SQL: 查找包含具有指定名称的列的所有表
取得巨大成功.它允许我查找包含特定列的所有表.我的问题是我正在处理的数据库似乎有很多空表(可能大约一半的结果是空的).我想知道是否有办法修改链接中的代码,以便不显示空行/列.下面是链接中的代码:
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;
谢谢,
这样的事情可能没有大的努力:
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%的可靠性,你实际上要COUNT(*)
在每个表(使用动态SQL)上做一个你要检查的,但这可能已经足够了.