t- sql выбрать имена столбцов из всех таблиц, где есть хотя бы 1 нулевое значение - PullRequest
0 голосов
/ 24 января 2020

Контекст: я изучаю новую базу данных (на сервере MS SQL) и хочу знать для каждой таблицы все столбцы, которые имеют нулевые значения.

Т.е. результат будет выглядеть примерно так:

table column nulls
Tbl1  Col1   8

Я нашел этот код здесь в stackoverflow, который составляет таблицу имен столбцов таблиц - без оператора WHERE, который является моим добавлением. Я попытался отфильтровать нули в операторе WHERE, но затем таблица оказалась пустой, и я понимаю, почему - я проверяю, действительно ли имя столбца равно нулю, а не его содержимое. Но не могу понять, как поступить.

select schema_name(tab.schema_id) as schema_name,
tab.name as table_name, 
col.name as column_name

from sys.tables as tab
     inner join sys.columns as col
         on tab.object_id = col.object_id
     left join sys.types as t
         on col.user_type_id = t.user_type_id
-- in this where statement, I am trying to filter for nulls, but i get an empty result. and i know there are nulls
where col.name is null
order by schema_name, table_name, column_id

Я также попробовал это (см. 4-ую строку):

select schema_name(tab.schema_id) as schema_name,
tab.name as table_name, 
col.name as column_name
,(select count(*) from tab.name where col.name is null) as countnulls

from sys.tables as tab
     inner join sys.columns as col
         on tab.object_id = col.object_id
     left join sys.types as t
         on col.user_type_id = t.user_type_id
order by schema_name, table_name, column_id

последняя возвращает ошибку "Неверное имя объекта 'tab.name'."

1 Ответ

1 голос
/ 24 января 2020

имя столбца не может быть пустым , но если вы имеете в виду обнуляемый столбец (столбец, который принимает нулевое значение), который имеет по крайней мере нулевое значение, поэтому вы можете использовать следующий оператор:

declare @schema varchar(255), @table varchar(255),  @col varchar(255), @cmd varchar(max)

DECLARE getinfo cursor for
SELECT schema_name(tab.schema_id) as schema_name,tab.name , col.name from sys.tables as tab
     inner join sys.columns as col on tab.object_id = col.object_id
where col.is_nullable =1 
order by schema_name(tab.schema_id),tab.name,col.name

OPEN getinfo

FETCH NEXT FROM getinfo into @schema,@table,@col

WHILE @@FETCH_STATUS = 0
BEGIN

    set @schema  = QUOTENAME(@schema)
    set @table = QUOTENAME(@table)
    set @col =  QUOTENAME(@col)
    SELECT @cmd = 'IF EXISTS (SELECT 1 FROM '+ @schema +'.'+ @table +' WHERE ' + @col + ' IS NULL) BEGIN SELECT '''+@schema+''' as schemaName, '''+@table+''' as tablename, '''+@col+''' as columnName, * FROM '+ @schema +'.'+ @table +' WHERE ' + @col + ' IS NULL end'
    EXEC(@cmd)

    FETCH NEXT FROM getinfo into  @schema,@table,@col
END

CLOSE getinfo
DEALLOCATE getinfo

которые используют курсор на всех nullable columns в каждом table в базе данных, затем проверьте, имеет ли этот столбец хотя бы одно нулевое значение, если да, выберите Имя схемы, имя таблицы, имя столбца и все записи, имеющие нулевое значение в этом столбце

, но если вы хотите получить только количество нулей, вы можете использовать следующий оператор:

declare @schema varchar(255), @table varchar(255),  @col varchar(255), @cmd varchar(max)

DECLARE getinfo cursor for
SELECT schema_name(tab.schema_id) as schema_name,tab.name , col.name from sys.tables as tab
     inner join sys.columns as col on tab.object_id = col.object_id
where col.is_nullable =1 
order by schema_name(tab.schema_id),tab.name,col.name

OPEN getinfo

FETCH NEXT FROM getinfo into @schema,@table,@col

WHILE @@FETCH_STATUS = 0
BEGIN
    set @schema  = QUOTENAME(@schema)
    set @table = QUOTENAME(@table)
    set @col =  QUOTENAME(@col)
    SELECT @cmd = 'IF EXISTS (SELECT 1 FROM '+ @schema +'.'+ @table +' WHERE ' + @col + ' IS NULL) BEGIN SELECT '''+@schema+''' as schemaName, '''+@table+''' as tablename, '''+@col+''' as columnName, count(*) as nulls FROM '+ @schema +'.'+ @table +' WHERE ' + @col + ' IS NULL end'
    EXEC(@cmd)

    FETCH NEXT FROM getinfo into  @schema,@table,@col
END

, который использует курсор на всех nullable columns в каждом table в базе данных, затем проверьте, имеет ли этот столбец хотя бы одно нулевое значение, если да, выберите Имя схемы, имя таблицы, имя столбца и подсчитайте все записи, имеющие нулевое значение в этом столбце

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...