【问题标题】:Find all Tables that contain Column Name; Filter Empties查找所有包含列名的表;过滤空
【发布时间】:2017-06-03 07:22:46
【问题描述】:

我一直在使用这里找到的 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;

谢谢你,

【问题讨论】:

  • 您可以使用动态 SQL 来完成。这是一个选择吗?
  • 说实话,我不完全确定那是什么。我快速浏览了谷歌和这里的帖子:stackoverflow.com/questions/4165020/what-is-dynamic-sql 说动态 SQL 会损害性能或者它并不总是必要的......我愿意尝试,但常规 SQL 可能会更好?
  • @JohnnyBaggadoughnuts 动态 sql 对于这种事情其实很不错。虽然我会使用 sys.partitions 来接受 Dan 的回答。
  • 性能是否值得关注?这似乎不应该一直运行 - 更像是一项维护任务?
  • 我认为性能不是什么大问题。我只在寻找东西时才运行它。这更像是维护,是的。

标签: sql sql-server


【解决方案1】:

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

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

【讨论】:

  • 我想说 sys.partitions 对于这种检查来说已经足够准确了(零与非零)。
  • 很可能是的,但是如果您要输出行数,让它比更少更准确可能会有所帮助
  • 谢谢丹,这应该很好用。现在有一个行列,这是必要的,但我可以导出为 CSV 并使用 Excel 或其他工具将其过滤掉。我只会每隔几周或几个月运行一次,所以这不是一个巨大的问题。再次感谢,
  • 如果您不需要输出该列,您可以从选择中将其注释掉或完全删除它(例如删除p.rowsips.record_count)。如果这回答了您的问题,请考虑将问题标记为已回答(投票选择器下方的复选框)以供未来读者阅读。
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2017-08-15
  • 2021-11-06
  • 2011-06-18
  • 1970-01-01
  • 2015-02-27
  • 2022-09-28
相关资源
最近更新 更多