如何找到哪些列没有任何数据(所有值都为NULL)?

jra*_*ara 13 sql t-sql sql-server stored-procedures sql-server-2008

我在数据库中有几个表.我想找到哪些列(在哪些表中)没有任何值(列中的所有NULL).我在下面的例子中,结果应该是

TestTable1 --> Var2
TestTable2 --> Variable1
Run Code Online (Sandbox Code Playgroud)

我不知道如何创建这种查询.非常感谢您的帮助!

--create first table
create table dbo.TestTable1 (
sur_id int identity(1,1) not null primary key,
var1 int null,
var2 int null
)
go

--insert some values
insert into dbo.TestTable1 (var1) 
    select 1 union all select 2 union all select 3

--create second table
create table dbo.TestTable2 (
sur_id int identity(1,1) not null primary key,
variable1 int null,
variable2 int null
)

--and insert some values
insert into dbo.TestTable2 (variable2) 
    select 1 union all select 2 union all select 3
Run Code Online (Sandbox Code Playgroud)

And*_*mar 11

对于单个列,count(ColumnName)返回ColumName不为null 的行数:

select  count(TheColumn)
from    YourTable
Run Code Online (Sandbox Code Playgroud)

您可以为所有列生成查询.根据Martin的建议,您可以排除不能为null的列is_nullable = 1.例如:

select  'count(' + name + ') as ' + name + ', '
from    sys.columns
where   object_id = object_id('YourTable')
        and is_nullable = 1
Run Code Online (Sandbox Code Playgroud)

如果表的数量很大,您可以以类似的方式为所有表生成查询.所有表的列表都在sys.tables.

  • 为什么不`COUNT(col)`?这只计算`NOT NULL`值. (2认同)

Dai*_*Dai 5

这是我编写的用于执行相同操作的脚本,它是一个两步的手动过程:

  1. 在SSMS中运行此脚本,然后在“结果”窗格中选择所有行:
选择
'选择
    COUNT(DISTINCT ['+ COLUMN_NAME +'])AS UniqueValues,
    '''+ TABLE_NAME +'。+ COLUMN_NAME +'''AS ColumnName
从
    ['+ TABLE_SCHEMA +']。['+ TABLE_NAME +']

全联盟
'
从
    INFORMATION_SCHEMA.COLUMNS
订购
    TABLE_NAME,
    COLUMN_NAME
  1. 将结果粘贴到新的查询窗口中。滚动到最底部,然后删除结尾的UNION ALL语句。它看起来像这样:
从[dbo]中选择COUNT(DISTINCT [ModifiedByUserId])AS UniqueValues,'Inspections.ModifiedByUserId'AS ColumnName。[检查] UNION ALL  
SELECT COUNT(DISTINCT [Notes])AS UniqueValues,“ Inspections.Notes” AS ColumnName FROM [dbo]。[Inspections] UNION ALL  
选择COUNT(DISTINCT [PublicPassword])AS唯一值,'Inspections.PublicPassword'AS列名,来自[dbo]。[Inspections] UNION ALL  
选择COUNT(DISTINCT [ShopId])AS UniqueValues,'Inspections.ShopId'AS ColumnName FROM [dbo]。[Inspections] UNION ALL  
选择COUNT(DISTINCT [状态])AS唯一值,'Inspections.Status'AS列名,来自[dbo]。[Inspections] UNION ALL  
从[dbo]中选择COUNT(DISTINCT [SupervisorUserId])AS UniqueValues,'Inspections.SupervisorUserId'AS ColumnName。[检查] UNION ALL  
  1. 运行查询。在一个300列的数据库上运行大约需要6分钟。取决于使用多少索引,它会更快或更慢。