2014-01-23 107 views
-1

我在SQL Server中有一個包含369列的表。如何獲得所有行中具有'NULL'的所有日期列表

在這369列中,127列的類型爲date,其中一些127個日期列在所有行中都有null值。

如何在所有行中獲得這些date列的列表,並且使用NULL值?

+0

http://stackoverflow.com/questions/7791361/sql-to-return-list-of-fields-containing-non-null-data –

+13

_「我有一個369列的表」___ OMG,你有沒有曾聽說過[正常化](http://en.wikipedia.org/wiki/Database_normalization)? –

+0

您確定要「所有**行**中的NULL值列表」嗎?而不是所有日期列都爲NULL的行?第一個很容易,最後一個也是,但是輸入很多.. – NickyvV

回答

0

這可能是非常耗費大量資源的操作,這取決於表的大小,但是這應該這樣做:

產生一些SQL:

select 
    TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, column_name, DATA_TYPE, IS_NULLABLE, 
    cmd = 'case when count(*)=sum(case when [' + COLUMN_NAME + '] is null then 1 else 0 end) then 1 else 0 end as [' + COLUMN_NAME + '__isAllNulls],' 
from information_schema.columns 
where 1=1 
    and DATA_TYPE like '%date%' 
    and TABLE_NAME = '<yourtablename>' 

然後寫的選擇:

select 
    <paste CMD from above results> 
from <yourtablename> 

編輯2:粘貼生成的CMD列後的樣本最終查詢如下所示:

select 
    case when count(*)=sum(case when [DateAdded] is not null then 1 else 0 end) then 1 else 0 end as [DateAdded__isAllNulls], 
    case when count(*)=sum(case when [DateModified] is null then 1 else 0 end) then 1 else 0 end as [DateModified__isAllNulls], 
    case when count(*)=sum(case when [DateClosed] is null then 1 else 0 end) then 1 else 0 end as [DateClosed__isAllNulls] 
from yourtable 

結果應該是這樣的:

DateAdded__isAllNulls DateModified__isAllNulls DateClosed__isAllNulls 
1      0       0 

編輯:簡單min()max()會更好,比我case when count(*)=sum(case ...,如@Damien_the_Unbeliever在他的評論暗示,但你仍然可以使用我的代碼來生成SQL 。

+0

Where子句中的1 = 1沒有必要。 – Jade

+0

謝謝,我跑了第一個查詢,它給了我這樣的結果: – user3227041

+0

謝謝,我跑了第一個查詢,它給了我這樣的結果:TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE IS_NULLABLE cmd。我沒有得到你想讓我做的第二件事「選擇 <從以上結果粘貼CMD> from 」。另一個問題是,那些日期字段列存儲在表中作爲varchar數據類型 – user3227041

相關問題