У меня есть база данных с ~ 420 таблицами. Во всех таблицах есть столбцы аудита: поле1, поле2, поле3.
Как мне написать запрос, чтобы проверить, есть ли какие-либо значения NULL в любом из этих столбцов аудита по всей базе данных?
Разные СУБД по-разному хранят метаданные о таблицах. Итак, какую СУБД вы используете? SQL Server, RedShift, Oracle, MySQL, SQLite, PostgreSQL и т. д. И т. Д. И т. Д.?
Это БД SQL-сервера
если столбец допускает значение NULL, следует предположить, что имеется значение NULL, нет? или, по крайней мере, могло быть.





Ниже должен помочь вам трюк, поиграйте, если вам нужен другой вывод.
CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256) = ''
DECLARE @ColumnName nvarchar(100)
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
-- check tables
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
)
-- check if above table has columns we want to check
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND COLUMN_NAME IN ('field1', 'field2', 'field3')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
-- insert into temp table if column value is null
IF @ColumnName IS NOT NULL
INSERT INTO #Results EXEC('SELECT DISTINCT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +' WHERE ' + @ColumnName + ' IS NULL ')
END
END
-- return results
SELECT ColumnName, ColumnValue FROM #Results
-- drop temp table
DROP TABLE #Results
Получите метаданные базы данных, а затем используйте динамический SQL. Метаданные сообщают вам полный список таблиц и столбцов. Затем используйте динамический SQL для сборки пользовательских операторов SQL для каждой таблицы, например
select count(case when field1 is null then 1 end) as f1 from table1.