2016-10-19 63 views
0

我有一個包含以下列的表:F1,F2,... F10 其中一些列僅包含NULLS,假設它們是F2和F7。 我怎樣才能得到一個字符串與這些列的名稱,我想獲得'F2,F7'作爲返回值。 這是一個臨時表和列名稱,列數未知。我需要一些非常通用的函數來提取包含NULL的列名稱從SQL Server表中獲取所有不爲NULL的列名稱

注意: 我知道在Oracle中使用某些系統對象(即all_tab_columns等)很容易,不確定是否可以在SQL Server中使用。

謝謝。

+0

實際上,你應該重新設計你的表工作動態方法。這不是你怎麼做 –

+0

爲什麼我應該重新設計表格?這不是關於表結構的問題,它與表NULL結構有關 –

+0

您可以使用UNPIVOT和XML控制技巧。 –

回答

3

不知道爲什麼你需要這一點,但這樣的事情應該可以幫助您

Select CASE WHEN Len(res) > 0 THEN LEFT(res, Len(res) - 1) ELSE '' END AS result 
From 
(
select case when Count(F1)= 0 then 'F1,' else '' End + 
     case when Count(F2)= 0 then 'F2,' else '' End + 
     case when Count(F3)= 0 then 'F3,' else '' End + 
      ..... 
     case when Count(F10)= 0 then 'F10,' else '' End 
     End as res 
From yourtable 
) A 

這裏是一個未知的列名

DECLARE @sql VARCHAR(max) ='' 

SET @sql = ' Select CASE WHEN Len(res) > 0 THEN LEFT(res, Len(res) - 1) ELSE '''' END AS result 
From 
(
select' 
SET @sql += (SELECT ' case when Count(' + COLUMN_NAME + ')= 0 then ''' + COLUMN_NAME + ','' else '''' End+' 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE table_name = 'TableA' 
      FOR xml path ('')) 
SET @sql = LEFT(@sql, Len(@sql) - 1) 
SET @sql += ' From yourtable) A (res)' 

--SELECT @sql 
EXEC (@sql) 
+0

我不認爲這個查詢會起作用。 –

+1

@vkp - 可能你應該說爲什麼它不會改善我的回答 –

+0

problem1-case在第一個真實條件下返回一個值,其他條件將被忽略。問題2-你應該使用'計數(當f1不爲空然後是1結束時)= 0' –

相關問題