質問:
特定のテーブルに対して、列の値がNULLであるすべての列名を取得できるSQL(SQL Server 2008クエリ)が必要です。
どんな助けでも大歓迎です。
質問:
特定のテーブルに対して、列の値がNULLであるすべての列名を取得できるSQL(SQL Server 2008クエリ)が必要です。
どんな助けでも大歓迎です。
以下は機能するはずです。データベース、スキーマ、およびテーブルでフィルタリングされます。列のいずれかの行に値が存在する場合に列名を取得します (ただし、 /条件を変更することにより、変数にNULL
含まれるクエリで任意の方法で操作して設定できる小さな考慮事項です)。@sql
EXISTS
NOT EXISTS
DECLARE @dbname VARCHAR(100) = 'yourDB'
DECLARE @schemaName VARCHAR(100) = 'yourSchema'
DECLARE @tableName VARCHAR(100) = 'yourTable'
DECLARE @result TABLE (col VARCHAR(4000))
SELECT @dbname dbname
,t.name tbl
,c.name col
INTO #temp
FROM sys.columns c
JOIN sys.tables t ON
t.object_id = c.object_id
WHERE c.is_nullable = 1
AND t.name = @tableName
DECLARE @sql NVARCHAR(MAX) =
STUFF(
(
SELECT 'UNION ALL SELECT CASE WHEN EXISTS (SELECT 1 FROM ' + @dbname + '.' + @schemaName + '.' + tbl + ' WHERE ' + col + ' IS NULL) THEN '''+ @schemaName + '.' + tbl + '.' + col+''' END AS NULL_Value_Exists '
FROM #temp
FOR XML PATH('')
), 1, 10, ' ')
INSERT @result
EXEC(@sql)
SELECT *
FROM @result
WHERE col IS NOT NULL
DROP TABLE #temp
特定の条件を満たす特定のスキーマからすべてのテーブルのすべての列を取得する場合は、テーブル名を指定する必要さえなく、単純に join しsys.schemas
ます。これにより、指定されたスキーマのすべてのテーブルから、任意の行に含まれるすべての列のリストが得られます。NULL
必要なのは、最初のクエリを次のように変更することだけです。
SELECT @dbname dbname
,t.name tbl
,c.name col
INTO #temp
FROM sys.columns c
JOIN sys.tables t ON
t.object_id = c.object_id
JOIN sys.schemas s ON
s.schema_id = t.schema_id
WHERE c.is_nullable = 1
AND s.name =@schemaName