2017-01-18 1 views
4

Я использую SQL здесь: Find all tables containing column with specified nameНайти все таблицы, содержащие имя столбца; Фильтр Очищает

с большим успехом. Это позволяет мне находить все таблицы, содержащие определенный столбец. Моя проблема в том, что в базе данных, на которой я работаю, похоже, много пустых таблиц (возможно, около половины моих результатов - это пустые). Мне было интересно, если есть способ, чтобы изменить код в связи таким образом, что пустые строки/столбцы не presented.Below код из ссылки:

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; 

Спасибо,

+0

Вы можете сделать это с помощью динамического SQL. Это вариант? – logixologist

+0

Если честно, я не совсем уверен, что это. Я быстро просмотрел Google и сообщение здесь: http://stackoverflow.com/questions/4165020/what-is-dynamic-sql Говорит, что динамический SQL может повредить производительность, или это не всегда необходимо ... Я ' m готовы попробовать, но обычный SQL может быть лучше? –

+0

@JohnnyBaggadoughnuts динамический sql на самом деле довольно хорош для такого рода вещей. Хотя я бы пошел с ответом Дэна, используя sys.partitions. –

ответ

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% надежности на это, вы бы на самом деле сделать COUNT(*) на каждом столе (с использованием Dynamic SQL), который вы хотите проверить, но это, вероятно, достаточно хорошо.

+1

Я бы сказал, что sys.partitions более чем достаточно точна для такого типа проверки (ноль против ненулевого). –

+0

Скорее всего, да, но если вы выводите число строк, может быть полезно, чтобы оно было более точным, чем меньше –

+0

Спасибо, Dan, это должно хорошо работать. Теперь есть столбец для строк, что необходимо, но я могу экспортировать в CSV и фильтровать его с помощью Excel или что-то в этом роде. Я буду работать только каждые несколько недель или месяцев, чтобы это не было огромным кононном. Еще раз спасибо –

Смежные вопросы