レガシーデータベースを継承しましたが、多くのフィールドが使用されなくなりました。過去数年間にクエリを実行し、どのフィールドがnullであるかを確認することで、少なくとも私が見る可能性のある場所のベースラインを取得することができます。
特定のセットのすべてのレコードについて、データベース内のどのフィールドがnullであるかを把握するための洗練された方法はありますか?
レガシーデータベースを継承しましたが、多くのフィールドが使用されなくなりました。過去数年間にクエリを実行し、どのフィールドがnullであるかを確認することで、少なくとも私が見る可能性のある場所のベースラインを取得することができます。
特定のセットのすべてのレコードについて、データベース内のどのフィールドがnullであるかを把握するための洗練された方法はありますか?
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になる列はすべてnullになります(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
また、機能し、一度に多数のフィールドに対してそれを行うことができます。
アーロンベルトランのテンプレートを盗む:
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