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 не для слабонервных.