SQL - получить строки из всех таблиц, в которых общий столбец равен нулю

Мне нужно найти все строки в любой таблице, где дата создания / обновления равна нулю

Существует более 500 таблиц, поэтому сделать что-то вроде следующего невозможно.

SELECT * 
FROM 
    (SELECT 
         'tableA' AS `table`,
         IF(COUNT(`column_a`), NULL, 'column_a') AS `column`
     FROM tableA

     UNION ALL

     SELECT 
         'tableB' AS `table`,
         IF(COUNT(`column_b`), NULL, 'column_b') AS `column`
     FROM tableB

     UNION ALL
     -- etc.
     ) t 
WHERE 
    `column` IS NOT NULL

Я подумал, что мог бы использовать INFORMATION_SCHEMA как-то, но у меня возникли трудности с этим.

1 ответ

Обычно я делаю это с помощью sys.tables для заполнения списка таблиц во временной таблице, а затем создаю динамический SQL вокруг этого списка.

select quotename( schemas.name ) + '.' + quotename(tables.name) as tbl
into #work 
from sys.tables
join sys.schemas on tables.schema_id = schemas.schema_id

select 

'select ''' + tbl + ''' as [table] where exists ( select * from ' + tbl + ' where column_a is null )' as sqlcmd,

'select ''' + tbl + ''' as [table], * from ' + tbl + ' where createdate is null ' as sqlcmd

from #work

drop table #work

Если у вас есть список, вы можете выполнить его вручную в SSMS или выполнить итерацию по нему, используя курсор для выполнения каждого оператора. Однако кавычки могут вызвать головную боль. Динамический SQL не для слабонервных.

Другие вопросы по тегам