查找所有包含列名称的表格;过滤掉空白的。
查找所有包含列名称的表格;过滤掉空白的。
我一直在使用找到的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;
谢谢,
admin 更改状态以发布 2023年5月22日
像这样做可能不需要太大的努力:
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(*)
,但这可能已经足够了。