2

问题:

对于给定的表,我需要一个 SQL(SQL Server 2008 查询),它可以获取所有列值为 NULL 的列名。

任何帮助表示赞赏。

4

1 回答 1

1

以下应该可以工作,它由数据库、模式和表过滤。当列的任何行中存在值时,它会检索列名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
于 2012-10-12T09:45:38.263 回答