我继承了一个遗留数据库,并且许多字段不再使用。我可以通过查询过去几年并查看哪些字段为空来判断,至少可以获得我可能查看的位置的基线。
有没有一种优雅的方法来确定数据库中的哪些字段对于给定集合中的所有记录都为空?
我继承了一个遗留数据库,并且许多字段不再使用。我可以通过查询过去几年并查看哪些字段为空来判断,至少可以获得我可能查看的位置的基线。
有没有一种优雅的方法来确定数据库中的哪些字段对于给定集合中的所有记录都为空?
DECLARE @table NVARCHAR(512);
SET @table = N'dbo.tablename';
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = N'';
SELECT @sql = @sql + QUOTENAME(name)
+ ' = SUM(CASE WHEN ' + QUOTENAME(name) + ' IS NULL THEN 1 ELSE 0 END),'
FROM sys.columns
WHERE object_id = OBJECT_ID(@table)
AND is_nullable = 1;
SELECT @sql = 'SELECT ' + @sql + ' Total_Count = COUNT(*)
FROM ' + @table + ';';
EXEC sp_executesql @sql;
任何输出为 0 的列都为空值(除非 Total_Count 列也输出为 0,在这种情况下,表为空)。请注意,此查询在大型表上会非常昂贵。
这是你需要的吗?
SELECT count(*)
FROM table
WHERE field IS NULL
或者当然
SELECT SUM(CASE WHEN field IS NULL THEN 1 ELSE 0 END) AS [field is null count]
COUNT(*) as [total count]
FROM table
也可以,你可以一次为一堆领域做。
窃取 Aaron Bertrand 的模板:
DECLARE @tableName NVARCHAR(512)
SET @tableName = N'dbo.tablename';
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = N'';
SELECT @sql = @sql + N' SUM(CASE WHEN ' + QUOTENAME(name) + ' IS NULL THEN 1 ELSE 0 END) AS ['+name+' null count], '
FROM sys.columns
WHERE object_id = OBJECT_ID(@tableName) AND is_nullable = 1;
SELECT @sql = 'SELECT ' + @sql + ' Total_Count = COUNT(*)
FROM ' + @tableName + ';';
EXEC sp_executesql @sql;
这为您提供了具有 NULL 字段的所有记录的计数,您可以将其与所有记录的计数进行比较
SELECT COUNT(*)
FROM Table1
WHERE COALESCE (Field1, Field2, etc) IS NULL