问题:
对于给定的表,我需要一个 SQL(SQL Server 2008 查询),它可以获取所有列值为 NULL 的列名。
任何帮助表示赞赏。
问题:
对于给定的表,我需要一个 SQL(SQL Server 2008 查询),它可以获取所有列值为 NULL 的列名。
任何帮助表示赞赏。
以下应该可以工作,它由数据库、模式和表过滤。当列的任何行中存在值时,它会检索列名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