【问题标题】:how to get column names where column value is null in SQL Server 2008如何在 SQL Server 2008 中获取列值为空的列名
【发布时间】:2012-10-12 07:27:14
【问题描述】:

问题:

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

感谢任何帮助。

【问题讨论】:

  • 列名为空?我假设您想返回记录为空的所有列?
  • 该列的任何值或该列的所有值都应该为空吗?
  • 或者另一种选择是您想知道所有可以接受空值的列。您需要编辑您的问题,并更清楚地了解您实际要查找的内容。

标签: sql-server-2008 columnname


【解决方案1】:

以下应该可以工作,它按数据库、模式和表过滤。当列的任何行中存在NULL 值时,它会检索列名(但这只是一个次要考虑因素,您可以通过更改@987654323 在包含在@sql 变量中的查询中随意设置和设置它@/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

如果您想从满足给定条件的特定模式中获取所有表的所有列,您甚至不必指定表名,只需加入 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

【讨论】:

  • 太好了,不客气,如果您发现最有用的答案,您可以将其标记为正确。
猜你喜欢
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多