2

質問:

特定のテーブルに対して、列の値がNULLであるすべての列名を取得できるSQL(SQL Server 2008クエリ)が必要です。

どんな助けでも大歓迎です。

4

1 に答える 1

1

以下は機能するはずです。データベース、スキーマ、およびテーブルでフィルタリングされます。列のいずれかの行に値が存在する場合に列名を取得します (ただし、 /条件を変更することにより、変数にNULL含まれるクエリで任意の方法で操作して設定できる小さな考慮事項です)。@sqlEXISTSNOT 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
于 2012-10-12T09:45:38.263 に答える