2012-10-12 79 views
2

問題:如何獲得SQL Server 2008中列值爲NULL的列名稱

對於給定的表,我需要一個SQL(SQL Server 2008查詢),它可以獲取列值爲NULL的所有列名。

任何幫助表示讚賞。

+0

列名是空的?我假設你想要返回記錄爲空的所有列? –

+2

列的任何值或該列的所有值是否應爲空? –

+2

或者另一種選擇是你想知道所有可以接受*空值的列。你需要編輯你的問題,並更清楚你實際試圖找到什麼。 –

回答

1

以下應該工作,它被數據庫,模式和表過濾。當列中任何一行存在NULL值時,它會檢索列名稱(但這只是一個次要考慮因素,您可以通過更改EXISTS/NOT EXISTS條件以任意方式將其設置爲包含在@sql變量中的查詢):

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 [email protected] 
+0

謝謝!這一直奏效! –

+0

太好了,不客氣,如果您發現最有用的答案,您可以將其標記爲正確。 –