sql - 查找所有包含列名的表;过滤空

标签 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;

谢谢,

最佳答案

像这样的事情可能不需要付出巨大的努力:

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)上,但这可能已经足够了。

关于sql - 查找所有包含列名的表;过滤空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41727482/

相关文章:

sql-server - SQL Server 中的复合聚集索引

SQL Server 查询计算余额

javascript - Sequelize 多个左连接

mysql - 两个表通过 WHERE 子句条件关联(如果存在或不存在)

sql - SQL Server 分区计数中的计数

sql-server - 无法在 SQL Server 2019 中使用 Java Double.MIN_VALUE 4.9E-324 作为浮点文字

SQL - 如何计算是和否项目

mysql - 在 MySQL 中用 1 个键查询 2 个以上的表?

MySQL:按计算的步长间隔限制结果

sql - 从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间